标题说明了一切:我想知道perl语句是否像
@array = func(\@array);
总是在perl中表现出确定性,即右手边的评估是否在任何东西存储在左侧的@array之前完成。 func
是一个任意的perl内置函数或用户定义的函数,可以修改或不修改引用传递的@array。
是。 $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