大佬教程收集整理的这篇文章主要介绍了perl – 编译顺序和post前缀opertors,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我很确定它与参数编译的顺序有关
谢谢,
首先,让我们看一下操作数评估顺序.这不是为许多运算符定义的,而是为列表运算符定义的.记录下以从左到右的顺序评估其操作数[1].这意味着printf的参数按以下顺序计算:
>“%d%d%d%d”
> $a
> $a
> $a
> $a
关键在于知道$a不会在堆栈上放置$a值的副本.它放置标量本身(SV *,用C表示).在Perl术语中,我们说堆栈元素别名为$a [2].在计算理论中,你会说参数是通过引用传递的.
同样适用于$a,但$a必须在堆栈上放置$a的副本.
这意味着我们可以将上面的printf调用视为等效
use Data::Alias qw( alias ); { local @_; alias $_[0] = "%d %d %d %d"; alias $_[1] = $a; # Places $a on the stack. alias $_[2] = ++$a; # Adds one to $a and places $a on the stack. alias $_[3] = $a++; # Places a copy of $a on the stack and adds one to $a. alias $_[4] = $a; # Places $a on the stack. &CORE::printf; }
当$a被调用时,$a包含6.
到调用printf时,$a包含7.
解决方法是复制值.
$perl -le'$a = 5; my @b = ($a,$a); print "@b";' 7 7 6 7 $perl -le'$a = 5; my @b = (0+$a,0+(++$a),$a); print "@b";' 5 6 6 7
>从perlop开始,“在列表上下文中,它只是列表参数分隔符,并将其参数插入到列表中.这些参数也从左到右进行计算.”
>从perlsyn开始,“传入的任何参数都显示在数组@_中.因此,如果你调用一个带有两个参数的函数,那么它们将存储在$_ [0]和$_ [1]中.数组@_是一个局部数组,但它的元素是实际标量参数的别名.“
以上是大佬教程为你收集整理的perl – 编译顺序和post前缀opertors全部内容,希望文章能够帮你解决perl – 编译顺序和post前缀opertors所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。