Lit*_*rat 3 perl operator-precedence
请你能解释一下这种明显不一致的行为:
use strict;
my @a;
print "a" x 2; # this prints: aa
@a = "a" x 2; print @a; # this prints: aa
print ("a") x 2; # this prints: a
@a = ("a") x 2; print @a; # this prints: aa
Run Code Online (Sandbox Code Playgroud)
不应该最后一个打印一个'a'?
编辑:好的,现在这对我来说更有意义:"二进制"x"是重复运算符...在列表上下文中,如果左操作数括在括号中或者是由qw/STRING /形成的列表,它重复了这个清单." perlop得到
这对我来说很清楚(二进制x - 为什么使用二进制这个词?是否有一个否定X?)但无论如何:@a =("a")x 2#似乎在列表上下文中,因为我们有一个数组在开头 - 一个数组不是一个列表,但它包含一个列表,所以我认为我们可能有一个列表上下文,(虽然它们可能是同义词,但不是数组上下文).
我想"左操作数"是("a").(或者是那个或@a).perlop没有说明操作数实际上是什么,查询perldoc.perl.org给出"找不到匹配",谷歌搜索给出"在计算机编程中,操作数是用于描述任何能够被操纵的对象的术语".就像数组一样.
因此左操作数可能会括在括号中,所以它可能会"重复列表".该列表是:("a") x 2
或者是:("a")
如果我们重复,("a") x 2我们会得到("a") x 2 ("a") x 2.这似乎不对.
如果我们键入:print $a[1]我们将得到一个'a',所以"它重复列表"意味着Perl变成("a") x 2了("a", "a")所以我们有效地获得@a=("a", "a")
但是,print ("a") x 2没有变成("a", "a").那是因为print是一个具有高优先级的"列表运算符".所以我们有效地得到:(print ("a")) x 2
数组是一个术语,因此它也具有高优先级,但@ a = stuff涉及赋值运算符=,它具有相对较低的优先级.所以它与印刷品截然不同.
添加use warnings;在你的脚本,那么你会得到警告像
print (...) interpreted as function .
Useless use of repeat (x) in void context .
Run Code Online (Sandbox Code Playgroud)
做到像print (("a") x 2);#这个打印:aa
正如您在评论中提到的,如何格式化代码,我会说看Perltidy.
Perltidy是一个Perl脚本,用于缩进和重新格式化Perl脚本,使其更易于阅读.如果你编写Perl脚本,或者花很多时间阅读它们,你可能会发现它很有用.
关于Perltidy的更多信息:
您可以下载perltidy并使用其默认值运行它,或者自定义它以使用您喜欢的支撑样式,缩进宽度等.
定制很简单,有很多选择.默认值通常是一个很好的起点.
Perltidy还可用于生成代码的彩色HTML输出.
Perltidy带有一套合理的默认值; 但它们可能不适合你.幸运的是,您可以使用tidyview作为图形用户界面来预览perltidy对代码的更改,并查看哪些选项最适合您.您可以从CPAN 下载tidyview.
注意:始终添加use strict并use warnings在脚本的开头添加.