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


考虑Perl中的以下程序。

use strict;
use warnings;

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

print scalar @foo;

这将死于一个错误消息:

尝试修改只读值...

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

1 = shift @foo;

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

如果我们这样做:

(1) = shift @foo;

所有这些对我都有意义。但是推杆 undef 在列表中将起作用。

(undef) = shift @foo;

现在打印 2

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

my (undef, undef ,$mode, undef ,$uid, $gid, undef ,$size) = stat($filename);

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

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


3179
2017-09-07 10:06


起源



答案:


在内部,Perl具有不同的标量赋值和列表赋值运算符,即使它们都是拼写的 = 在源代码中。列表赋值运算符具有特殊情况 undef 那你问的问题。


10
2017-09-07 10:42



你能提供一个链接来源吗? - simbabque
到底是什么? Perl的源代码并不简单。你可以看看 github.com/Perl/perl5/blob/blead/op.c 并搜索 op_sassign 和 op_aassign,如果这有帮助。或者,可能更有用,通过执行以下操作来查看编译的字节码: perl -MO=Terse -E '(undef) = 1;' - Calle Dybedahl
对不起,我应该用不同的措辞。我的意思是,你能提供一些东西来支持这个解释吗?因为你没有链接到文档说我认为你曾在其他地方寻找它,很可能是源。 :) - simbabque
谢谢你的解释。 - simbabque


答案:


在内部,Perl具有不同的标量赋值和列表赋值运算符,即使它们都是拼写的 = 在源代码中。列表赋值运算符具有特殊情况 undef 那你问的问题。


10
2017-09-07 10:42



你能提供一个链接来源吗? - simbabque
到底是什么? Perl的源代码并不简单。你可以看看 github.com/Perl/perl5/blob/blead/op.c 并搜索 op_sassign 和 op_aassign,如果这有帮助。或者,可能更有用,通过执行以下操作来查看编译的字节码: perl -MO=Terse -E '(undef) = 1;' - Calle Dybedahl
对不起,我应该用不同的措辞。我的意思是,你能提供一些东西来支持这个解释吗?因为你没有链接到文档说我认为你曾在其他地方寻找它,很可能是源。 :) - simbabque
谢谢你的解释。 - simbabque