好的,对于初学者来说:列表运算符是 Perl 中优先级最低的事物之一,但是仅在他们的右侧。你问这意味着什么:好吧,让我们简单点。假设有一个名为的listopfoo
。它做什么并不重要,但它就在那里。你可以轻松地创建这样的东西sub foo { map 10 * $_, @_ }
它返回每个参数乘以十的结果。那不碍事:
print 1, 2, 3;
相当于print( 1, 2, 3 );
print foo 1, 2, 3;
相当于print( foo( 1, 2, 3 ) );
print 1, foo 2, 3;
相当于print( 1, foo( 2, 3 ) );
我们可以看到foo
在右侧尽可能多地吞噬——只有语句的结尾(到目前为止......)才能阻止它。如果我们写@array = (1, foo 2, 3);
这相当于@array = (1, foo(2, 3) );
因为当然结束括号仍然适用。
由于逗号的优先级也非常低(就在“列表运算符(向右)”上方),我们还可以将几乎任何类型的表达式放入 listop 的参数中 - 这只是 perl 确保我们不这样做的方式大多数时候不必添加括号。数学、按位运算符、比较,甚至正则表达式匹配都具有更高的优先级。
唯一的事情是do具有较低优先级的是拼写出来的逻辑连接词and
, or
, xor
, and not
。所以如果我们写
foo 1, 2, 3 and 4;
这意味着(foo(1, 2, 3) and 4)
——论据foo
停在左边and
。这在一个人为的例子中看起来很愚蠢,所以让我们把它变成一个常见的 Perl 习惯用法:
open $fh, '<', $filename or die "$! opening $filename";
这相当于
(open($fh, '<', $filename) or die("$! opening $filename"));
这实际上完全等同于(并编译为)
die "$! opening $filename" unless open $fh, '<', $filename;
使用语句修饰符形式unless
(它根本不是一个运算符,每个语句只允许一次,并且只出现在语句的末尾,因此它根本不参与优先级,但您可以将其视为“低于最低”优先向左)。
所以无论如何,回到你的原始代码示例——参数print
的左侧结束and
,并在右侧and
是一个完全独立的逗号表达式——它什么也不做,因为它只是一些常量3 > 4
and "\n"
在 void 上下文中进行评估。