Должен ли я использовать внутренние :: svreadonly для создания переменных Readonly в Perl?
Вопрос
Глядя в 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
переменная).