为什么Perl中的undef列表不是只读或常量值?

sim*_*que 11 perl

考虑Perl中的以下程序.

use strict;
use warnings;

my @foo = qw(a b c);
undef = shift @foo;

print scalar @foo;
Run Code Online (Sandbox Code Playgroud)

这将死于一个错误消息:

尝试修改只读值...

使用constat会产生不同的错误:

1 = shift @foo;
Run Code Online (Sandbox Code Playgroud)

无法修改标量赋值中的常量项...
执行...因编译错误而中止.

如果我们这样做:

(1) = shift @foo;
Run Code Online (Sandbox Code Playgroud)

所有这些都对我有意义.但是undef列入清单会有效.

(undef) = shift @foo;
Run Code Online (Sandbox Code Playgroud)

现在它打印2.

当然,如果您有一堆返回值并且只想要特定的值,这是常见的做法,例如:

my (undef, undef ,$mode, undef ,$uid, $gid, undef ,$size) = stat($filename);
Run Code Online (Sandbox Code Playgroud)

perldoc -f undef中的第9行代码示例显示了这一点,但没有解释.

我的问题是,Perl如何在内部处理这个问题?

Cal*_*ahl 10

在内部,Perl具有用于标量赋值和列表赋值的不同运算符,即使它们都=在源代码中拼写.列表赋值运算符具有undef您要询问的特殊情况.

  • 到底是什么?Perl的源代码并不简单.您可以查看https://github.com/Perl/perl5/blob/blead/op.c并搜索"op_sassign"和"op_aassign",如果有帮助的话.或者,可能更有用,通过执行以下操作来查看编译的字节码:`perl -MO = Terse -E'(undef)= 1;'` (3认同)