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

为什么在Perl中,undef列表不是只读或常量值?,perl,Perl,考虑以下Perl程序 use strict; use warnings; my @foo = qw(a b c); undef = shift @foo; print scalar @foo; 这将随着一条错误消息而消失: 试图在…处修改只读值 使用常量将产生不同的错误: 1 = shift @foo; 无法在… 执行。。。由于编译错误而中止 如果我们这样做,也是一样的: (1) = shift @foo; 所有这些对我来说都有意义。但是,将undef放入列表将起作用 (undef)

考虑以下Perl程序

use strict;
use warnings;

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

print scalar @foo;
这将随着一条错误消息而消失:

试图在…处修改只读值

使用常量将产生不同的错误:

1 = shift @foo;
无法在…
执行。。。由于编译错误而中止

如果我们这样做,也是一样的:

(1) = shift @foo;
所有这些对我来说都有意义。但是,将
undef
放入列表将起作用

(undef) = shift @foo;
现在它打印
2

当然,如果您有一组返回值,并且只需要特定的返回值,这是常见的做法,如下所示:

my (undef, undef ,$mode, undef ,$uid, $gid, undef ,$size) = stat($filename);
示例中的第9行代码显示了这一点,但没有解释


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

在内部,Perl对标量赋值和列表赋值有不同的运算符,即使它们在源代码中都拼写为
=
。list assignment操作符有一个特殊的例子,用于你要询问的
unde

你能提供一个到源代码的链接吗?到底是什么?Perl的源代码并不十分简单。如果有帮助,您可以查看并搜索
op\u sassign
op\u aassign
。或者,可能更有用的是,通过如下操作查看编译的字节码:
perl-MO=Terse-E'(unde)=1;'