これが可能かどうか疑問に思っていました:
use Modern::Perl;
my @list = ('a' .. 'j');
map { func($_) } each(@list);
sub func {
my ($index, $value) = @_;
say "$index => $value";
}
これが可能かどうか疑問に思っていました:
use Modern::Perl;
my @list = ('a' .. 'j');
map { func($_) } each(@list);
sub func {
my ($index, $value) = @_;
say "$index => $value";
}
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;
最も簡単なアプローチは次のとおりです。
func($_, $a[$_]) for 0..$#a;
リスト コンテキストでeach @array
は、配列インデックスとそのインデックスにある配列要素の値の 2 つの要素を持つリストを返します。通話中
map { ... } each @array
したがって
($index,$value) = each @array;
map { ... } ($index,$value);
これはおそらくあなたが望むものではありません。インデックス引数と値引数を取ることになっている場合func
、次のようなことをしたいかもしれません
map { func($_, $list[$_]) } 0 .. $#list;
使用するだけfor
です:
for ( my $index = 0; $index < scalar @list; $index++ ){
my $value = $list[$index];
say "$index => $value";
}
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
この方法で配列のインデックスを取得するために使用できます。