查看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 ..
答案 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
变量中显示了一些有趣的东西)。