赋值@array = func(\ @ array)是否在perl中表现良好?

时间:2018-01-04 16:39:30

标签: perl

标题说明了一切: 我想知道perl语句是否像

@array = func(\@array);

总是在perl中表现出确定性,即右手边的评估是否在左侧的@array中存储任何内容之前完成。 func是一个任意perl内置函数或用户定义的函数,可以修改或不修改通过引用传递的@array。

1 个答案:

答案 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