perl将映射和每个

perl将映射和每个,perl,Perl,我只是想知道这是否可能: use Modern::Perl; my @list = ('a' .. 'j'); map { func($_) } each(@list); sub func { my ($index, $value) = @_; say "$index => $value"; } 仅用于: 仅用于: 您将映射视为一个循环,放弃返回值。在这种情况下,您还可以使用循环。但是,不能将每个@list用作这样的循环条件,因为它不会扩展为完整列表。从perldoc-f各

我只是想知道这是否可能:

use Modern::Perl;

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

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

sub func {
  my ($index, $value) = @_;
  say "$index => $value";
}
仅用于:

仅用于:

您将映射视为一个循环,放弃返回值。在这种情况下,您还可以使用循环。但是,不能将每个@list用作这样的循环条件,因为它不会扩展为完整列表。从perldoc-f各:

在列表上下文中调用时,返回由 哈希的下一个元素的键和值,或索引和 数组的下一个元素的值,以便可以在 它

此外,您只向子例程传递一个值,而不是同时传递两个值。每条语句将展开为两个元素的列表,即下一个索引和数组的元素。但map每次迭代只取其中一个。所以你得到了输出:

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]";
}
键可以以这种方式用于获取数组的索引。

您将映射视为一个循环,放弃返回值。在这种情况下,您还可以使用循环。但是,不能将每个@list用作这样的循环条件,因为它不会扩展为完整列表。从perldoc-f各:

在列表上下文中调用时,返回由 哈希的下一个元素的键和值,或索引和 数组的下一个元素的值,以便可以在 它

此外,您只向子例程传递一个值,而不是同时传递两个值。每条语句将展开为两个元素的列表,即下一个索引和数组的元素。但map每次迭代只取其中一个。所以你得到了输出:

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]";
}
键可以以这种方式用于获取数组的索引。

不可以,因为每次调用时,每个键都返回一个键/值对。您只调用它一次,因此它将向映射传递0,$list[0],并且每个值都将调用一次子例程

如果要使用每个键/值对调用func,可以编写

map { func($_, $list[$_]) } keys @list;
但这是滥用map,因为它是用来将一个列表映射到另一个列表的。你应该用这个来代替

func($_, $list[$_]) for keys @list;
my ($i, $v);
func($i, $v) while ($i, $v) = each @list;
你也可以这样使用每一个

func($_, $list[$_]) for keys @list;
my ($i, $v);
func($i, $v) while ($i, $v) = each @list;
不可以,因为每次调用时都返回一个键/值对。您只调用它一次,因此它将向映射传递0,$list[0],并且每个值都将调用一次子例程

如果要使用每个键/值对调用func,可以编写

map { func($_, $list[$_]) } keys @list;
但这是滥用map,因为它是用来将一个列表映射到另一个列表的。你应该用这个来代替

func($_, $list[$_]) for keys @list;
my ($i, $v);
func($i, $v) while ($i, $v) = each @list;
你也可以这样使用每一个

func($_, $list[$_]) for keys @list;
my ($i, $v);
func($i, $v) while ($i, $v) = each @list;
在列表上下文中,每个@array返回一个包含两个元素的列表—一个数组索引和该索引处的数组元素的值。召唤

map { ... } each @array
就这样

($index,$value) = each @array;
map { ... } ($index,$value);
这可能不是你想要的。如果func应该接受一个索引参数和一个值参数,那么您可能需要执行以下操作

map { func($_, $list[$_]) } 0 .. $#list;
在列表上下文中,每个@array返回一个包含两个元素的列表—一个数组索引和该索引处的数组元素的值。召唤

map { ... } each @array
就这样

($index,$value) = each @array;
map { ... } ($index,$value);
这可能不是你想要的。如果func应该接受一个索引参数和一个值参数,那么您可能需要执行以下操作

map { func($_, $list[$_]) } 0 .. $#list;

最直接的方法是:

func($_, $a[$_]) for 0..$#a;
但如果你要去wimsy,还有:

use List::MoreUtils qw( pairwise );

pairwise { func($a, $b) }
   @{[ keys   @a ]},
   @{[ values @a ]};

最直接的方法是:

func($_, $a[$_]) for 0..$#a;
但如果你要去wimsy,还有:

use List::MoreUtils qw( pairwise );

pairwise { func($a, $b) }
   @{[ keys   @a ]},
   @{[ values @a ]};

呃……你到底想干什么?将子例程引用应用于列表的每个元素并返回转换后的列表。我只是想知道这是否可行:[code]-很多事情都是可能的,包括香草酱的pizza quattro stagioni。你想实现什么?呃……你到底想做什么?将子例程引用应用于列表的每个元素并返回转换后的列表。我只是想知道这是否可行:[code]-很多事情都是可能的,包括香草酱的pizza quattro stagioni。你想达到什么目的?我讨厌键的原因与我讨厌@lines=的原因相同。对于我的$index 0..$列表,它不会变平-它是一个计数循环,而不是foreach循环-而且比C样式更可读。我讨厌键的原因与我讨厌@lines=的原因相同。对于我的$index 0..$列表,它不会变平-它是一个计数循环,不是foreach循环-而且它比C风格更可读。或者当我的$i,$v=each@list{func$i,$v}或当我的$i,$v=each@list{func$i,$v}或使用算法::Loops'MapCar'&MapCar\&func,[keys@a],[values@a];或者使用算法::循环“MapCar”&MapCar\&func,[keys@a],[values@a];