perl - 为什么这个 Perl one-liner of Fibonacci 工作?

标签 perl one-liner

print$f+=$z=$f-$z,$/for--$z..8
或者,如果将 $z 替换为 $!,则可以执行以下操作。
print$f+=$!=$f-$!for--$!..8
但为什么? $!是错误 perlval,不是吗?

最佳答案

如果我们放一些空间以使其更具可读性:

print $f += $z = $f - $z ,$/ for --$z .. 8
让我们将不同的部分提取到正常代码中。首先,使用常规 for环形。
for (--$z .. 8) {
     print $f += $z = $f - $z ,$/
}
前缀 -- auto-decrement operator将采用未初始化的变量 $z ,将其转换为 0,减去 1,然后返回 -1 .这与分配 -1 基本相同至 $z .
我们从 -1 到 8 循环。这些数字无关紧要,因为它们被分配给 $_ ,从未使用过。基本上我们只循环 10 个步骤。此步骤中使用的变量无关紧要。它可以是任何可以赋值的变量,这就是为什么 $! -- OS error variable也有效。
我们可以将语句简化为
$z = -1;
for (0 .. 9)
打印语句主要打印两件事:
$f += $z = $f - $z
$/
用逗号分隔的两个语句 , ,表示它是一个列表。预定义变量 $/input record separator ;默认情况下它是换行符(取决于操作系统)。 print需要一个参数列表,这就是它的工作方式。 print自动换行与 say 相同.所以我们可以交换它并将代码简化为:
say $f += $z = $f - $z
让我们解开这个任务。它基本上是两个语句,从右到左依次执行,以打印结束:
$z = $f - $z
$f += $z
say $f
如果我们把它放在一起,我们得到:
$z = -1;
for (0 .. 9) {       # loop 10 times
    $z = $f - $z;    # calculate increment
    $f += $z;        # increment value
    say $f;          # print value
}
它是这样工作的:
我们知道$z最初是 -1从 for 循环。从 $f从未使用过,它将是未定义的(在减法上下文中使用时将被强制转换为 0)。所以我们得到:
$z = $f - $z = undef - (-1) = 0 + 1 = 1
$f += $z = 1 => $f = $f + 1 => $f = 1
所以第一次循环迭代打印 1。下一轮
$z = $f - $z = 1 - 1 = 0
$f += $z = 0 => $f = $f + 0 = 1 + 0 = 1
下一个打印也是 1。下一回合
$z = $f - $z = 1 - 0 = 1
$f += $z = 1 => $f = $f + 1 = 1 + 1 = 2
等等。

关于perl - 为什么这个 Perl one-liner of Fibonacci 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68055101/

相关文章:

perl - 如何为 PSGI/Plack 网络应用程序(在 Perl 中)提供静态文件(图像等)?

python - 将包含一项的列表转换为字典值中的项本身

java - 如何在一行中将数​​组连接到字符串(Java)?

perl - Perl 单行程序中的逆多行 grep

regex - 编译正则表达式时可以捕获 "Unrecognized escape"警告吗?

perl - 您建议使用哪个 Perl 模块来发送和接收电子邮件?

perl - 如何检查 Perl 脚本是否有任何编译错误?

linux - 如何远程验证多台 Linux 服务器上的多个应用程序日志

python - 列表理解可以分为两个列表吗?

python - 如何减少 lambda 表达式中辅助函数的使用?