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

时间:2010-11-04 16:24:06

标签: perl readonly scalar

查看Const::Fast source我注意到它在内部使用了内置函数Internals::SvREADONLY。在我的Perl脚本中直接使用该函数是否安全?它似乎存在于Perl 5.8的核心中。

my $PI = 4 * atan2 1, 1;
Internals::SvREADONLY($PI => 1);
$PI = 2.718;   # Modification of a read-only value attempted at ..

2 个答案:

答案 0 :(得分:4)

C:\>perldoc Internals
No documentation found for "Internals".

没有

更具体地说,由于某种原因,该包被命名为“Internals”。它不适合在核心之外使用。它可能会更改,恕不另行通知。

答案 1 :(得分:2)

这并没有完全回答你的问题,但我认为值得一提,所以其他人不会遇到与我相同的痛苦:如果你正在运行,请不要使用任何 readonly值在早于5.10.1的Perl版本上。考虑一下这个小例子:

{
    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变量中显示了一些有趣的东西)。