Perl:优先级(向左列表运算符)
在编写Perl pg 90时,他说:Perl:优先级(向左列表运算符),perl,Perl,在编写Perl pg 90时,他说: @ary = (1, 3, sort 4, 2); print @ary; 排序右侧的逗号在排序之前求值,而左侧的逗号在…之后求值。。。列表运算符容易被吞下。。然后表现得像一个简单的词“ 赋值是否导致正在处理排序,还是在通过打印扩展@ary时发生排序 他所说的“逗号”是什么意思?我的理解是,在赋值语句中,逗号的优先级比列表运算符低,因此排序首先运行,并吞噬它的参数(4和2)。逗号到底是如何计算的?这样statement就变成了(1,3,2,4
@ary = (1, 3, sort 4, 2);
print @ary;
排序右侧的逗号在排序之前求值,而左侧的逗号在…之后求值。。。列表运算符容易被吞下。。然后表现得像一个简单的词“
@ary
时发生排序(4和2)
。逗号到底是如何计算的?这样statement就变成了(1,3,2,4)一个被分配的列表..逗号只是作为一个列表分隔符,而不是一个运算符!!事实上在第108页他说:不要把逗号的标量上下文用法和列表上下文用法混淆起来print@ary
是向右列表运算符,所以优先级很低
打印($foo,退出)$foo
和exit
。那么为什么exit不被视为字符串呢???毕竟优先级较高的print(列表运算符)具有更高的优先级
print $foo, exit;
这里有print和,运算符,但list运算符具有更高的优先级..因此..exit应被视为字符串-为什么不
print ($foo & 255) + 1, "\n";
在这里,由于它是一个列表操作符,所以它会打印$foo&255
,上面提到的exit
东西不应该发生类似的情况
sort
在调用时进行计算,它实际上与赋值无关。sort
返回一个列表。因此,您要赋值的是:
@ary=(1,3,(2,4))1,3,2,4
print
的作用类似于Perl中的任何其他函数(或我在这方面使用过的任何其他语言)。如果将函数作为参数调用,则该函数的返回值将作为参数给出。因此:
print ($foo, exit);
或同等品(帕伦夫妇不重要)
什么也不做,因为您要求它打印退出的返回值。您的程序首先退出,所以您什么也得不到。我不明白为什么您希望exit
被视为字符串。exit
在所有上下文中都是函数,除非您引用它
print ($foo & 255) + 1,"\n";
从给出此示例的perlop
:
乍一看可能没有达到你的预期。括号
将要计算的“print”的参数列表括起来(打印
“$foo&255”的结果。然后将一个添加到
“打印”(通常为1)。结果如下:
要正确地执行您的意思,您必须写:
如果对Perl如何解析构造有疑问,可以通过
B::Deparse
模块运行代码,该模块将从编译的内部表示生成Perl源代码。对于第一个示例:
$ perl -MO=Deparse,-p -e '@ary = (1, 3, sort 4, 2); print @ary;'
(@ary = (1, 3, sort(4, 2)));
print(@ary);
-e syntax OK
如您所见,sort
将这两个参数移到右边
就执行顺序而言,您可以通过B::简明
模块(我已经添加了注释)了解到这一点:
不确定下面的内容是否完全准确(这是来自IRC、上面提到的答案、谷歌和我对这本书的解释的一个混乱)
非常感谢大家!为什么不像我们这些普通人那样使用括号呢?
exit
在许多常见的上下文中都是有效的空话:$foo{exit}=…
,例如。但是Perl总是将一个纯文字参数转换为打印
,并尝试将其解析为函数。@mob:不是函数,而是文件句柄。Perl-Mstrict-le'print xyzy'
嗨,谢谢!我发现这两个答案都非常有用!而且非常有用!但它们不是我想要的。我在我的文章中已经回答过了完整性方面我有自己的想法,但我会同意Eric的答案,因为我不知道那个模块。
1 + 1, "\n"; # Obviously not what you meant.
print(($foo & 255) + 1, "\n");
$ perl -MO=Deparse,-p -e '@ary = (1, 3, sort 4, 2); print @ary;'
(@ary = (1, 3, sort(4, 2)));
print(@ary);
-e syntax OK
$ perl -MO=Concise,-exec -e '@ary = (1, 3, sort 4, 2); print @ary;'
1 <0> enter
2 <;> nextstate(main 1 -e:1) v:{
3 <0> pushmark s # start of list
4 <$> const[IV 1] s # 1 is added to list
5 <$> const[IV 3] s # 3 is added to list
6 <0> pushmark s # start of sort's argument list
7 <$> const[IV 4] s # 4 is added to sort's argument list
8 <$> const[IV 2] s # 2 is added to sort's argument list
9 <@> sort lK # sort is run, and returns its list into the outer list
a <0> pushmark s
b <#> gv[*ary] s
c <1> rv2av[t2] lKRM*/1
d <2> aassign[t3] vKS/COMMON # the list is assigned to the array
e <;> nextstate(main 1 -e:1) v:{
f <0> pushmark s # start of print's argument list
g <#> gv[*ary] s # the array is loaded into print's argument list
h <1> rv2av[t5] lK/1
i <@> print vK # print outputs it's argument list
j <@> leave[1 ref] vKP/REFC
-e syntax OK
$ perl -MO=Deparse,-p -e 'print $foo, exit;'
print($foo, exit);
-e syntax OK
$ perl -MO=Concise,-exec -e 'print $foo, exit;'
1 <0> enter
2 <;> nextstate(main 1 -e:1) v:{
3 <0> pushmark s
4 <#> gvsv[*foo] s # add $foo to the argument list
5 <0> exit s # call `exit` and add its return value to the list
6 <@> print vK # print the list, but we never get here
7 <@> leave[1 ref] vKP/REFC
-e syntax OK
$ perl -MO=Deparse,-p -e 'print ($foo & 255) + 1, "\n";'
((print(($foo & 255)) + 1), '???'); # '???' means this was optimized away
-e syntax OK
$ perl -MO=Concise,-exec -e 'print ($foo & 255) + 1, "\n";'
1 <0> enter
2 <;> nextstate(main 1 -e:1) v:{
3 <0> pushmark v
4 <0> pushmark s
5 <#> gvsv[*foo] s
6 <$> const[IV 255] s
7 <2> bit_and[t2] sK
8 <@> print sK
9 <$> const[IV 1] s
a <2> add[t3] vK/2
b <@> list vK
c <@> leave[1 ref] vKP/REFC
-e syntax OK