2

これが可能かどうか疑問に思っていました:

use Modern::Perl;

my @list = ('a' .. 'j');

map { func($_) } each(@list);

sub func {
  my ($index, $value) = @_;
  say "$index => $value";
}
4

5 に答える 5

8

eachいいえ、呼び出されるたびにキーと値のペアを返すため、できません。一度だけ呼び出しているため、 に渡さ(0, $list[0])map、サブルーチンは値ごとに 1 回呼び出されます。

各キーと値のペアで呼び出したい場合は、次のfuncように記述できます

map { func($_, $list[$_]) } keys @list;

mapしかし、あるリストを別のリストにマッピングするためのものであるため、これは誤用です。for代わりにこのように使用する必要があります

func($_, $list[$_]) for keys @list;

eachこのように使用することもできます

my ($i, $v);
func($i, $v) while ($i, $v) = each @list;
于 2012-06-12T22:04:01.847 に答える
3

最も簡単なアプローチは次のとおりです。

func($_, $a[$_]) for 0..$#a;
于 2012-06-13T02:09:31.070 に答える
2

リスト コンテキストでeach @arrayは、配列インデックスとそのインデックスにある配列要素の値の 2 つの要素を持つリストを返します。通話中

map { ... } each @array

したがって

($index,$value) = each @array;
map { ... } ($index,$value);

これはおそらくあなたが望むものではありません。インデックス引数と値引数を取ることになっている場合func、次のようなことをしたいかもしれません

map { func($_, $list[$_]) } 0 .. $#list;
于 2012-06-12T22:08:56.860 に答える
0

使用するだけforです:

for ( my $index = 0; $index < scalar @list; $index++ ){
   my $value = $list[$index];
   say "$index => $value";
}
于 2012-06-12T21:54:00.127 に答える
0

map戻り値を破棄して、ループとして扱っています。その場合は、ループを使用することもできます。each @listただし、完全なリストに展開されないため、そのようなループ条件として使用することはできません。からperldoc -f each:

リスト コンテキストで呼び出されると、ハッシュの次の要素のキーと値、または配列の次の要素のインデックスと値で構成される 2 要素のリストを返します。これにより、反復処理が可能になります。

また、両方ではなく、単一の値のみをサブルーチンに渡しています。ステートメントeachは、配列の次のインデックスと要素の 2 つの要素のリストに展開されます。ただし、map反復ごとにそれらの1つだけを取ります。したがって、出力が得られます。

Use of uninitialized value $value in concatenation...
0 =>
Use of uninitialized value $value in concatenation...
a =>

おそらくあなたが望むのは次のようなものです:

func($_) for keys @list;

sub func {
    my $index = shift;
    say "$index => $list[$index]";
}

keysこの方法で配列のインデックスを取得するために使用できます。

于 2012-06-12T22:03:18.883 に答える