Должен ли я использовать Internals :: SvREADONLY для создания переменных только для чтения в Perl? - PullRequest
1 голос
/ 04 ноября 2010

Просмотр источника 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 ..

Ответы [ 2 ]

4 голосов
/ 04 ноября 2010
C:\>perldoc Internals
No documentation found for "Internals".

номер

Точнее говоря, пакет называется «Internals» по причине. Он не предназначен для использования вне ядра. Может измениться без уведомления.

2 голосов
/ 04 ноября 2010

Это не совсем ответ на ваш вопрос, но я думаю, что стоит упомянуть, чтобы другие не испытывали такой же боли, как я: не используйте любое значение только для чтения, если вы работаете на версия Perl более ранняя, чем 5.10.1. Рассмотрим этот маленький пример:

{
    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-фу не очень высокий, я не могу объяснить, что здесь происходит очень связно (но Devel :: Peek показывает некоторые интересные вещи в переменной $class).

...