这失败了:

my @a = ("a", "b", "c", "d", "e");
my %h = map { "prefix-

这失败了:

Not enough arguments for map at foo.pl line 4, near "} @a"

出现此错误:

my @a = ("a", "b", "c", "d", "e");
my %h = map { "prefix-" . 

这失败了:

my @a = ("a", "b", "c", "d", "e");
my %h = map { "prefix-

这失败了:

Not enough arguments for map at foo.pl line 4, near "} @a"

出现此错误:

<*>

但这有效:

<*>

为什么?

" => 1 } @a;

出现此错误:

<*>

但这有效:

<*>

为什么?

=> 1 } @a;

但这有效:

<*>

为什么?

" => 1 } @a;

出现此错误:

<*>

但这有效:

<*>

为什么?

有帮助吗?

解决方案

因为Perl猜测EXPR(例如哈希引用)而不是BLOCK。这应该有用(注意'+'符号):

my @a = ("a", "b", "c", "d", "e");
my %h = map { +"prefix-

因为Perl猜测EXPR(例如哈希引用)而不是BLOCK。这应该有用(注意'+'符号):

<*>

请参阅 http://perldoc.perl.org/functions/map.html

" => 1 } @a;

请参阅 http://perldoc.perl.org/functions/map.html

其他提示

我更喜欢把它写成

my %h = map { ("prefix-

我更喜欢把它写成

<*>

显示意图,我将返回一个2元素列表。

" => 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

来自 perldoc -f map

<*>", 1 } @array # perl guesses EXPR. wrong %hash = map { +"\L

来自 perldoc -f map

<*>", 1 } @array # perl guesses BLOCK. right %hash = map { ("\L

来自 perldoc -f map

<*>", 1) } @array # this also works %hash = map { lc(

来自 perldoc -f map

<*>), 1 } @array # as does this. %hash = map +( lc(

来自 perldoc -f map

<*>), 1 ), @array # this is EXPR and works! %hash = map ( lc(

来自 perldoc -f map

<*>), 1 ), @array # evaluates to (1, @array) or to force an anon hash constructor use "+{" @hashes = map +{ lc(

来自 perldoc -f map

<*>), 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{

另外,另一种方法是做你正在做的事情,初始化哈希,你可以这样做:

my @a = qw( a b c d e );
my %h;
@h{@a} = ();

这将为五个键中的每个键创建undef条目。如果你想给他们所有真正的价值,那么就这样做。

@h{@a} = (1) x @a;

您也可以使用循环显式地执行此操作;

<*>} = 1 for @a;

我认为

map { ; "prefix-

我认为

<*>

是更惯用的,只要指定它是一个语句块而不是哈希引用。你只是用空语句踢它。

" => 1 } @a;

是更惯用的,只要指定它是一个语句块而不是哈希引用。你只是用空语句踢它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top