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);