リストから特定条件の要素のみを抽出する(grep)

back
grep を使う

grep EXPR, LIST
EXPR が真になる LIST の要素を返す

以下、例題

@array から、数字のみの要素を取得する
@num = grep(/^\d*$/, @array);

@array の要素のうち、undef になっているものを除く
@array = grep { defined } @array;

カンマ区切りの文字列を分解し、空要素をのぞく
@values = grep { length } split(/,/, $string);

ハッシュ %hash のキー名がアルファベットのものの値のリストを取得
@values = map { $hash{$_} } grep { /^[a-z]+$/ } keys %hash;

一週間アクセスのない空ファイルを削除する
unlink grep { -z and -A > 7 } @file_list;

サイズが 1M 以上のファイルを gzip で圧縮する
system("gzip", grep { -s > 1024**2 } @file_list);

順不同で数値が入っている配列 @nums から、値の上位10件を取得する
$i = 0;
@top10 = grep { $i++ < 10 } sort { $b <=> $a } @nums;
(10件取得した後もコードを評価するので効率的ではないけど)


ちなみに grep の第一引数の EXPR では、各リストの要素は $_ としてアクセスできる。
また、EXPR で $_ を変更すると、元のリスト(や配列やハッシュ)の値も変更される。

@array2 = grep { s/foo/bar/ } @array1;
@array1 の要素のうち、パターン"foo"にマッチするものを"bar"に置換した結果を
@array2 に代入。
しかし @array1 の要素も置換される。

back