Perl中的列表运算符优先级

Perl中的列表运算符优先级,perl,operator-precedence,Perl,Operator Precedence,我正在读《Perl入门》一书,书中给出了以下两条语句: print "Test one: ", 6 > 3 && 3 > 4, "\n"; print "Test two: ", 6 > 3 and 3 > 4, "\n"; 第一行不打印新行,第二行不打印新行 我对输出感到困惑。根据作者的说法,第二个语句给出了奇怪的输出,因为它就像说: print ("Test two: ", 6 > 3) and 3 > 4, "\n"; 然而,为什么第

我正在读《Perl入门》一书,书中给出了以下两条语句:

print "Test one: ", 6 > 3 && 3 > 4, "\n";
print "Test two: ", 6 > 3 and 3 > 4, "\n";
第一行不打印新行,第二行不打印新行

我对输出感到困惑。根据作者的说法,第二个语句给出了奇怪的输出,因为它就像说:

print ("Test two: ", 6 > 3) and 3 > 4, "\n";
然而,为什么第一句话不一样呢?我认为这与印刷的优先权有关。&&的优先级高于print,因此先对其求值,然后再进行打印。而“and”的优先级比print低,因此将打印6>3,print返回1,然后用“and”进行计算。然而,这并没有真正意义

我已经阅读了关于列表运算符的优先级如何工作的Perl文档,但是我仍然不理解这个示例。你们能把这两条语句分解一下,告诉我先印的是什么吗?您还可以解释一下Perl文档中提到列表运算符是“向左”和“向右”时的含义吗?谢谢



非常感谢大家的回答。我现在明白了。我确实是按照cjm所说的做的,并且认为有向左和向右的列表运算符。现在我明白了它的意思,我明白了整件事。

下面是用括号括起来的那些语句:

print("Test one: ", ((6 > 3) && (3 > 4)), "\n");
print("Test two: ", (6 > 3)) and ((3 > 4), "\n");
的优先级最高,然后是
和&
,然后是
,然后是
打印
,然后是

6>3
计算结果为
1
3>4
的计算结果为false,在Perl中,这是一个特殊值,在数字上下文中为0,但在字符串上下文中为空字符串(如下所示)。因此
((6>3)和&(3>4))
生成空字符串

因此,第一条语句将3个参数传递给
print
“testone:”
、空字符串和换行符。它按顺序打印每个参数

第二条语句只将两个参数传递给
print
“测试二:”
1
。新行不会被打印,因为它从未被传递到
print


我不知道如何更好地解释“向左”和“向右”。但也许让你困惑的是,你认为有“向左列表操作”和“向右列表操作”。这不是它的意思。它试图说明列表运算符右侧的所有内容都会被解释为该运算符的参数(除非您使用了一个极低优先级的布尔运算符,如
)。但是列表运算符左侧的内容与该列表运算符没有关联。

正如您所说,除了“这没有意义”部分之外

首先是

print "Test one: ", (6 > 3 && 3 > 4), "\n";
第二个呢

(print "Test two: ", 6 > 3) and (3 > 4, "\n");
如果启用警告(
使用警告
),则会得到警告
在无效上下文中无用地使用常量
,因为
的右侧计算为一个包含元素false和换行符的列表,但从未使用过


编辑:更正了我的3>4是未定义的索赔。False不是未定义的。它是定义的,不打印任何内容。

好吧,对于初学者来说:列表操作符是perl中优先级最低的东西之一,但只在右边。你会问这意味着什么:好吧,让我们简单一点。假设有一个名为
foo
的列表。它做什么并不重要,但它就在那里。您可以使用
sub foo{map 10*$\uu}
轻松创建这样一个对象,它返回其每个参数乘以10的结果。那就另当别论了:

打印1、2、3相当于
打印(1,2,3)
printfoo1,2,3
相当于
打印(foo(1,2,3))
print1,foo 2,3
相当于
打印(1,foo(2,3))

我们可以看到,
foo
在右边尽可能多地吞食——只有语句的结尾(到目前为止…)才能阻止它。如果我们写
@array=(1,foo 2,3)
相当于
@array=(1,foo(2,3))当然,因为结尾的圆括号仍然适用

由于逗号的优先级也很低(就在“List operators(rightward)”之上),我们还可以将几乎任何类型的表达式放入listop的参数中——这只是perl确保大多数时候不必添加括号的方法。数学、位运算符、比较,甚至正则表达式匹配都具有更高的优先级

唯一优先级较低的是指定的逻辑连接词
异或
,以及
。所以如果我们写

foo 1, 2, 3 and 4;
这意味着
(foo(1,2,3)和4)
——指向
foo
的参数停在
的左侧。在一个精心设计的示例中,这似乎很愚蠢,因此让我们将其转化为一种常见的perl习惯用法:

open $fh, '<', $filename or die "$! opening $filename";

打开$fh,'4
“\n”
在无效上下文中计算。

此代码打印警告。在德维尔甚至有更有趣的行为:REPL@xenoterracide,它并不打算成为好的Perl代码。这只是想说明优先级是如何工作的。@cjm对。。。尽管re.pl的行为似乎错误到足以让我对它提出一个bug。我们来看看会有什么结果。@hobbs:在什么方面是不正确的?musikk和我说了同样的话,只是我使用了一些额外的参数(他现在收回了
3>4
unde
)。原始语句的
perl-MO=Deparse,-p
输出与我的全括号版本相同。对于文件测试操作符,这是如何工作的?例如,使用我编写的测试
ok(不是-e$fn,“文件不存在”)
,这与我的预期相反。@HåkonHægland,文件测试操作符是,而不是列表操作符。但导致问题的是极低的优先级
而不是
,而不是t
(open($fh, '<', $filename) or die("$! opening $filename"));
die "$! opening $filename" unless open $fh, '<', $filename;