Perl 为什么此地图块包含明显无用的+;?
在浏览源代码时,我看到了以下几行代码:Perl 为什么此地图块包含明显无用的+;?,perl,map,Perl,Map,在浏览源代码时,我看到了以下几行代码: my @files_to_keep = qw (file1 file2); my %keep = map { + $_ => 1 } @files_to_keep; +在这个代码片段中做了什么?我使用Data::Dumper查看去掉加号是否有任何作用,但结果是一样的: $ perl cleanme.pl $VAR1 = { 'file1' => 1, 'file2' => 1
my @files_to_keep = qw (file1 file2);
my %keep = map { + $_ => 1 } @files_to_keep;
+
在这个代码片段中做了什么?我使用Data::Dumper
查看去掉加号是否有任何作用,但结果是一样的:
$ perl cleanme.pl
$VAR1 = {
'file1' => 1,
'file2' => 1
};
这用于防止出现解析问题。加号强制解释器像普通块一样工作,而不是表达式 令人担心的是,您可能正试图使用
map
的另一个(表达式)公式创建hashreference,就像这样
@array_of_hashrefs = map { "\L$_" => 1 }, @array
注意逗号。然后,如果解析器根据OP中的语句猜测您正在执行此操作,那么将出现缺少逗号的语法错误!要查看差异,请尝试引用“$”
。无论出于何种原因,解析器都认为这足以触发表达式行为
是的,这很奇怪。因此,许多多疑的Perl程序员比需要更多地抛出额外的加号(包括我)
以下是文档中的示例
%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)
对于有趣的阅读(风格上)和语法分析器错误的情况,请阅读以下内容:一元加号运算符只返回其操作数不变。添加一个甚至不会改变上下文 在你给出的例子中,它是完全无用的。但是在某些情况下,让下一个令牌成为一个不可否认的操作符是很有用的
例如,
map
有两个语法
map EXPR, LIST
及
块以{
开头,但表达式也可以。例如,{}
可以是块或哈希构造函数
那么,map
如何区分两者的区别呢?它猜测。这意味着它有时是错的
猜测错误的一种情况是:
map { $_ => 1 }, @list
您可以使用+
或;
将其插入到正确猜测中
map {; ... # BLOCK
map +{ ... # EXPR
所以在这种情况下,你可以使用
map +{ foo => $_ }, @list
但我更喜欢:
map({ foo => $_ }, @list)
另一个例子是省略参数周围的paren,第一个参数表达式以paren开头
print ($x+$y)*2; # Same as: 2 * print($x+$y)
它可以通过使用
print +($x+$y)*2;
但为什么为了避开帕伦斯就要大干一场呢?我更喜欢这样
print(($x+$y)*2);
查看文档末尾的更多信息:注意:尝试了其他运算符,但它们在
键
前面加了前缀。只有+
可以相应地工作。谢谢。我得到了地图阻止列表语法,例如my@squares=map{$\u*$\ u}@numbers;
,但是你什么时候使用过地图扩展列表?(或者反过来说。我仍然对术语BLOCK和EXPR感到困惑)@Joel Berger,BLOCK不像一个迷你子例程。如果你这么说是因为map反复调用它,那么你是说multiplicatino也是迷你子例程(因为你可以做map$\u*2,@L
).map的第一个参数就像一个迷你子例程。没有args。并且从中不能返回
。好吧,那也不像迷你子例程。你在说什么?!@Ably,只要你愿意。map{$\u*$\ u}@numbers
可以写成map($\u*$\ u*.@numbers)
或仅映射$\u*$\ uu、@numbers
@Alby,块是大括号内的一系列语句。表达式是一段代码,可以用作运算符的操作数。
print(($x+$y)*2);