标题说明了一切: 我想知道perl语句是否像
@array = func(\@array);
总是在perl中表现出确定性,即右手边的评估是否在左侧的@array中存储任何内容之前完成。 func
是一个任意perl内置函数或用户定义的函数,可以修改或不修改通过引用传递的@array。
答案 0 :(得分:4)
是。 $x = some_combination_of_operators($x)
和@a = some_combination_of_operators(@a)
是常见做法。
未明确记录赋值运算符的操作数评估顺序,但记录了my $x = $x;
和local $x = $x;
。作为另一个例子,@a = sort @a;
不仅是常见的,而且是优化的(进行就地排序)。这证明了对所讨论的构造的支持。即使像($x,$y)=($y,$x);
这样时髦的东西也完全受到支持。
最后,只有一个Perl编译器,它总能产生相同的结果。
$ perl -MO=Concise,-exec -e'@array = func(\@array);'
1 <0> enter
2 <;> nextstate(main 1 -e:1) v:{
3 <0> pushmark s \
4 <0> pushmark s |
5 <#> gv[*array] s |
6 <1> rv2av[t5] lKRM/1 > RHS of list assignment evaluated first
7 <1> srefgen sKM/1 |
8 <#> gv[*func] s/EARLYCV |
9 <1> entersub[t6] lKS/TARG /
a <0> pushmark s \
b <#> gv[*array] s > LHS of list assignment evaluated second
c <1> rv2av[t2] lKRM*/1 /
d <2> aassign[t7] vKS/COM_AGG
e <@> leave[1 ref] vKP/REFC
-e syntax OK