【问题标题】:Why is a list of undef not a read-only or constant value in Perl?为什么 undef 列表在 Perl 中不是只读或常量值?
【发布时间】:2015-12-02 20:28:45
【问题描述】:

考虑以下 Perl 程序。

use strict;
use warnings;

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

print scalar @foo;

这将终止并显示错误消息:

尝试修改只读值...

使用 const 会给出不同的错误:

1 = shift @foo;

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

如果我们这样做也一样:

(1) = shift @foo;

所有这些对我来说都很有意义。但是将undef 放入列表中会起作用。

(undef) = shift @foo;

现在它打印2

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

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

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

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

【问题讨论】:

    标签: perl


    【解决方案1】:

    在内部,Perl 对标量赋值和列表赋值有不同的运算符,尽管它们在源代码中都拼写为=。并且列表赋值运算符具有您所询问的 undef 的特殊情况。

    【讨论】:

    • 能否提供源链接?
    • 到底是什么? Perl 的源代码并不十分简单。如果有帮助,您可以查看 github.com/Perl/perl5/blob/blead/op.c 并搜索 op_sassignop_aassign。或者,可能更有用的是,通过执行以下操作查看编译后的字节码:perl -MO=Terse -E '(undef) = 1;'
    • 对不起,我应该换个说法。我的意思是,你能提供一些东西来支持这个解释吗?由于您没有链接到文档说我假设您在其他地方寻找它,很可能是来源。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2016-12-13
    • 1970-01-01
    • 2010-12-11
    • 2011-04-15
    • 2016-06-18
    • 1970-01-01
    相关资源
    最近更新 更多