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".

いいえ。

より具体的には、パッケージには理由から「内部」という名前が付けられています。コアの外部での使用は意図されていません。予告なく変更される場合があります。

于 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 に答える