Perl では、式とリストgrep
をmap
取り、リストの各要素の式を評価します。
2つの違いは何ですか?
grep
式に一致する元のリストの要素をmap
返し、元のリストの各要素に適用された式の結果を返します。
$ perl -le 'print join " ", grep $_ & 1, (1, 2, 3, 4, 5)'
1 3 5
$ perl -le 'print join " ", map $_ & 1, (1, 2, 3, 4, 5)'
1 0 1 0 1
最初の例では、リストのすべての奇数要素が出力されますが、2 番目の例では、対応する要素が奇数かどうかに応じて 0 または 1 が出力されます。
最も一般的な形式で考えると役立つことがわかりgrep()
ました。map()
grep {BLOCK} LIST
map {BLOCK} LIST
grep()
はフィルターです。BLOCK が true を返す項目のサブセットを LIST から返します。
map()
マッピング関数です。値を LIST から BLOCK に送信すると、BLOCK は 0 個以上の値のリストを返します。これらの BLOCK へのすべての呼び出しを組み合わせたセットが、 によって返される最終的なリストになりますmap()
。
map
リスト内のすべての要素に関数を適用し、結果を返します。
grep
関数が適用されたときにtrueと評価されるリスト内のすべての要素を返します。
my %fruits = (
banana => {
color => 'yellow',
price => 0.79,
grams => 200
},
cherry => {
color => 'red',
price => 0.02,
grams => 10
},
orange => {
color => 'orange',
price => 1.00,
grams => 225
}
);
my %red_fruits = map { $_ => $fruits{$_} }
grep { $fruits{$_}->{color} eq 'red' }
keys(%fruits);
my @prices = map { $fruits{$_}->{price} } keys(%fruits);
my @colors = map { $fruits{$_}->{color} } keys(%fruits);
my @grams = map { $fruits{$_}->{grams} } keys(%fruits);
# Print each fruit's name sorted by price lowest to highest:
foreach( sort { $fruits{$a}->{price} <=> $fruits{$b}->{price}} keys(%fruits) )
{
print "$_ costs $fruits{$_}->{price} each\n";
}# end foreach()
についてもう 1 つgrep
: スカラー コンテキストでは、見つかったアイテムの数を示します。これは、2 番目のリストは必要ないが、特定の種類の項目がいくつあるかを知りたい場合に便利です。
my @numbers = qw/1 2 3 4 5 6/;
my @odd_numbers = grep { $_ & 1 } @numbers; # grep returns (1, 3, 5)
my $how_many_odd = grep { $_ & 1 } @numbers; # grep returns 3
編集:OPがコメントで尋ねたので、map
同じようにスカラーコンテキストで使用できると言わなければなりません。重要なのはgrep
、これを行うことができるのは 2 つのうちの 1 つだけではなく、 でこれを行うと便利な場合があるということgrep
です。
grep をフィルター付きのマップと考えてください。map は反復し、すべてのアイテムで何かを行う機会を提供します。たとえば、次の 2 行は同等です。
my @copy = @original;
my @copy = map {$_} @original;
同様に、次の 2 つは同等です。
my @copy = grep {-f $_} @original;
@copy = ();
for (@original)
{
push @copy, $_ if -f $_;
}
grep は条件を挿入する機能を提供するため、フィルターになります。
ふざけて: grep はそのブロック スカラー コンテキストを提供し、map はそのブロック リスト コンテキストを提供します。(そして、BLOCK foreach LIST はそのブロックに void コンテキストを与えます。)