查看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 ..
查看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 ..
C:\>perldoc Internals
No documentation found for "Internals".
不。
更具体地说,这个包被命名为“Internals”是有原因的。它不适合在核心之外使用。它可能会更改,恕不另行通知。
这并不能完全回答您的问题,但我认为值得一提,这样其他人就不会像我一样经历同样的痛苦:如果您在早于 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
变量中显示了一些有趣的东西)。