为什么实现斐波那契数列的Perl单行代码可运行,用$!替换$z也生效?
解答
第一段斐波那契数列单行代码逻辑
对应代码:
print$f+=$z=$f-$z,$/for--$z..8
- 首先这段代码的
for循环只用来控制执行次数,根本没有用到遍历生成的元素,是非常讨巧的写法:
未初始化的变量$z在数值上下文默认值为0,执行--$z后$z被赋值为-1,生成的遍历列表是-1、0、1……8,共10个元素,对应循环体执行10次,正好输出前10个斐波那契数。 - 循环体的赋值遵循右结合规则,执行顺序从右到左:
先算最右侧的$f - $z,把结果赋值给$z,再把这个结果累加到$f上,最后打印$f和Perl默认换行符$/。 - 初始状态下
$f未初始化,数值上下文为0,递推过程完全符合斐波那契数列的规则:1、1、2、3、5、8、13、21、34、55。
用特殊变量$!替换后正常运行的原因
对应代码:
print$f+=$!=$f-$!for--$!..8
- 首先纠正一个常见误区:Perl的特殊变量
$!并不是只读变量,它本质是和C语言的errno全局错误码绑定的变量:数值上下文下读它会得到错误码的整数值,给它赋值会直接修改errno的数值。 - 这段代码全程只有对
$!的赋值和算术运算,没有调用任何系统API(比如open、read、connect这类),不会触发系统自动修改errno的值,所以$!在这里完全可以当普通的数值临时变量用,和第一段代码里的$z作用没有任何区别,自然能正常运行。
内容的提问来源于stack exchange,提问作者eeeeeeeeengo
相关产品推荐
相关产品推荐

