Должен ли я использовать внутренние :: svreadonly для создания переменных Readonly в Perl?

StackOverflow https://stackoverflow.com/questions/4098816

  •  29-09-2019
  •  | 
  •  

Вопрос

Глядя в Const :: быстрая источник Я заметил, что он использовал встроенный функцию 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".

Нет.

Более конкретно, пакет назван «внутренними» по какой -то причине. Он не предназначен для использования вне ядра. Это может измениться без предварительного уведомления.

Другие советы

Это не совсем отвечает на ваш вопрос, но я думаю, что стоит упомянуть, чтобы другие не испытывали ту же боль, так как у меня есть: не используйте Любые Readonly ценить, если вы работаете на версии 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-FU не очень высок, я не могу объяснить, что происходит здесь очень согласованно (но Devel :: Peek показывает некоторые интересные вещи в $class переменная).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top