这失败了:
my @a = ("a", "b", "c", "d", "e"); my %h = map { "prefix-$_" => 1 } @a;
有这个错误:
Not enough arguments for map at foo.pl line 4, near "} @a"
但这有效:
my @a = ("a", "b", "c", "d", "e"); my %h = map { "prefix-" . $_ => 1 } @a;
为什么?
因为Perl猜测EXPR(例如哈希引用)而不是BLOCK.这应该工作(注意'+'符号):
my @a = ("a", "b", "c", "d", "e"); my %h = map { +"prefix-$_" => 1 } @a;
请参阅http://perldoc.perl.org/functions/map.html.
我更愿意把它写成
my %h = map { ("prefix-$_" => 1) } @a;
显示意图,我将返回一个2元素列表.
来自perldoc -f map
:
"{" starts both hash references and blocks, so "map { ..." could be either the start of map BLOCK LIST or map EXPR, LIST. Because perl doesn’t look ahead for the closing "}" it has to take a guess at which its dealing with based what it finds just after the "{". Usually it gets it right, but if it doesn’t it won’t realize something is wrong until it gets to the "}" and encounters the missing (or unexpected) comma. The syntax error will be reported close to the "}" but you’ll need to change something near the "{" such as using a unary "+" to give perl some help: %hash = map { "\L$_", 1 } @array # perl guesses EXPR. wrong %hash = map { +"\L$_", 1 } @array # perl guesses BLOCK. right %hash = map { ("\L$_", 1) } @array # this also works %hash = map { lc($_), 1 } @array # as does this. %hash = map +( lc($_), 1 ), @array # this is EXPR and works! %hash = map ( lc($_), 1 ), @array # evaluates to (1, @array) or to force an anon hash constructor use "+{" @hashes = map +{ lc($_), 1 }, @array # EXPR, so needs , at end and you get list of anonymous hashes each with only 1 entry.
另外,另一种方法是做你正在做的事情,初始化哈希,你可以这样做:
my @a = qw( a b c d e ); my %h; @h{@a} = ();
这将为五个键中的每一个创建undef条目.如果你想给他们所有真正的价值,那就去做吧.
@h{@a} = (1) x @a;
您也可以使用循环显式地执行此操作;
@h{$_} = 1 for @a;