@H_301_6@
为什么以下有效?
my @ys = map { $_ * $_ } @xs;
而以下无效?
my @ys = map { $_ * $_ },@xs;
map是一个语言结构而不是真正的函数,还是有特殊的块规则?
解决方法
map是列表运算符和核心函数.这是一种简单的Perl语法,它在子例程的块参数之后不需要逗号.关于地图的特殊之处在于它还可以采用表格地图EXPR,LIST.如果将其与标准子例程一起使用,则仅评估EXPR并将其作为第一个参数传递.
块参数对所有子例程都有效,如果将原型应用于子例程定义,则可以使用块参数.例如,您可以通过编写来定义一个行为方式相同的mymap
use strict; use warnings; use 5.010; sub mymap(&@) { use Data::Dump; my $sub = shift; my @newlist; push @newlist,$sub->($_) for @_; @newlist; } say for mymap { $_ * $_ } 1,2,3;
产量
1 4 9