关于优先级+重复修饰符的问题

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涉及赋值运算符=,它具有相对较低的优先级.所以它与印刷品截然不同.

Nik*_*ain 7

添加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 strictuse warnings在脚本的开头添加.