1

查看Const::Fast 源代码,我注意到它在内部使用了内置函数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 ..
4

2 回答 2

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

不。

更具体地说,这个包被命名为“Internals”是有原因的。它不适合在核心之外使用。它可能会更改,恕不另行通知。

于 2010-11-04T19:32:43.910 回答
3

这并不能完全回答您的问题,但我认为值得一提,这样其他人就不会像我一样经历同样的痛苦:如果您在早于 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变量中显示了一些有趣的东西)。

于 2010-11-04T17:08:14.803 回答