代码之家  ›  专栏  ›  技术社区  ›  Eugene Yarmash

我是否应该使用Internals::SvREADONLY在Perl中创建只读变量?

  •  1
  • Eugene Yarmash  · 技术社区  · 14 年前

    调查 Const::Fast source 我注意到它使用了内置函数 Internals::SvREADONLY 在内部。直接在Perl脚本中使用该函数是否安全?它似乎出现在Perl5.8的核心中。

    my $PI = 4 * atan2 1, 1;
    Internals::SvREADONLY($PI => 1);
    $PI = 2.718;   # Modification of a read-only value attempted at ..
    
    2 回复  |  直到 14 年前
        1
  •  4
  •   Michael Carman    14 年前
    C:\>perldoc Internals
    No documentation found for "Internals".
    

    不。

    更具体地说,这个包之所以被命名为“内部”是有原因的。它不打算在堆芯外使用。它可以不经通知而改变。

        2
  •  2
  •   Ether    14 年前

    这并不能完全回答你的问题,但我认为值得一提,这样其他人就不会像我一样经历同样的痛苦:不要使用 任何 如果您运行的Perl版本早于5.10.1,则为只读值。举个小例子:

    {
        package Foo;
        sub foo { print "I'm in foo!\n"; }
    }
    
    use strict;
    use warnings;
    use Readonly;
    Readonly my @classes => qw(Foo);
    
    foreach my $class (@classes)
    {
        # this dies with "Can't call method "foo" without a package or object reference"
        $class->foo;
    }
    

    由于我的XS fu不是很高,我不能很连贯地解释这里发生的事情(但是Devel::Peek在 $class 变量)。

    推荐文章