当前位置:  开发笔记 > 编程语言 > 正文

为什么Perl中的map语句不能编译?

如何解决《为什么Perl中的map语句不能编译?》经验,为你挑选了4个好方法。

这失败了:

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;

为什么?



1> Leonardo Her..:

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

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

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



2> Andy Lester..:

我更愿意把它写成

my %h = map { ("prefix-$_" => 1) } @a;

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



3> Robert Gambl..:

来自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.



4> Andy Lester..:

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

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

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

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

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

@h{$_} = 1 for @a;

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有