配列からパターンに一致する要素を抽出する
grep
は、配列の要素から指定のパターンに一致する要素のみを抽出します。
リストコンテキスト (戻り値をリストとして受け取る状況) なら、その結果をリストとして返します。
スカラーコンテキスト (戻り値をスカラーとして受け取る状況) なら、結果リストの要素数を返します。
次のサンプルコードは、配列から "ro" を含む要素を抜き出します。
my @names = ( 'taro', 'jiro', 'hanako' );
my @hits = grep( /ro/, @names );
print join( ', ', @hits ); # taro, jiro
上記サンプルコードの grep
は、次のように記述することもできます。
my @hits = grep { /ro/ } @names;
これを省略せずに分かりやすく書くと次のようになります。
my @hits = grep { $_ =~ /ro/ } @names;
このように中カッコの中の条件に一致するものだけが、左辺の @hists に格納されます。
中カッコで $_ にアクセスできるということは、変換も可能になります。 ただし、$_ に格納された値はコピーではなくオリジナルです。 値を変更してしまうと、オリジナルの要素の値を変更することになりますので注意が必要です。
次のサンプルコードは、配列の要素に含まれる "ro" を "ka" に変換し、
grep
によって返ってきたリストの内容と、オリジナルの配列の内容を出力します。
my @names = ( 'taro', 'jiro', 'hanako' );
my @hits = grep { $_ =~ s/ro/ka/ } @names;
print join( ', ', @hits ), "\n"; # taka, jika
print join( ', ', @names ), "\n"; # taka, jika, hanako