14

Perl では、式とリストgrepmap取り、リストの各要素の式を評価します。

2つの違いは何ですか?

4

6 に答える 6

26

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 が出力されます。

于 2009-02-22T19:12:32.220 に答える
10

最も一般的な形式で考えると役立つことがわかりgrep()ました。map()

grep {BLOCK} LIST   
map  {BLOCK} LIST

grep()はフィルターです。BLOCK が true を返す項目のサブセットを LIST から返します。

map()マッピング関数です。値を LIST から BLOCK に送信すると、BLOCK は 0 個以上の値のリストを返します。これらの BLOCK へのすべての呼び出しを組み合わせたセットが、 によって返される最終的なリストになりますmap()

于 2009-02-22T23:16:59.480 に答える
4

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()
于 2009-02-26T00:32:56.310 に答える
3

についてもう 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です。

于 2009-02-22T20:24:38.817 に答える
2

grep をフィルター付きのマップと考えてください。map は反復し、すべてのアイテムで何かを行う機会を提供します。たとえば、次の 2 行は同等です。

my @copy = @original;
my @copy = map {$_} @original;

同様に、次の 2 つは同等です。

my @copy = grep {-f $_} @original;

@copy = ();
for (@original)
{
  push @copy, $_ if -f $_;
}

grep は条件を挿入する機能を提供するため、フィルターになります。

于 2009-02-22T20:05:20.237 に答える
0

ふざけて: grep はそのブロック スカラー コンテキストを提供し、map はそのブロック リスト コンテキストを提供します。(そして、BLOCK foreach LIST はそのブロックに void コンテキストを与えます。)

于 2011-05-19T08:04:58.000 に答える