Мне нужно локализовать некоторые переменные в другом пакете, но я не буду знать, как их имена, пока они не будут переданы. Мои попытки использовать local
с typeglobs не сработали, поэтому я вернулся к сохранению значение переменной и восстановление ее вручную. Есть ли способ лучше? Обратите внимание, что проверка на наличие ошибок, чтобы увидеть, существует ли переменная перед тем, как с ней связываться, для ясности исключена.
#!/usr/bin/perl
use strict;
use warnings;
my %orig;
for my $name (qw/foo bar baz/) {
my $var = \${$meta::{$name}};
$orig{$name} = $$var;
$$var = $$var * 2;
}
meta::p();
for my $name (keys %orig) {
my $var = \${$meta::{$name}};
$$var = $orig{$name};
}
meta::p();
package meta;
BEGIN {
our $foo = 1;
our $bar = 2;
our $baz = 3;
}
sub p { print join(" :: ", $meta::foo, $meta::bar, $meta::baz), "\n" }
Я пытаюсь избежать eval, как это:
my $eval = '';
for my $name (qw/foo bar baz/) {
$eval .= "local \$meta::$name = \$meta::$name * 2;\n";
}
eval "$eval meta::p()";
meta::p();
Является ли попытка избежать оценки бесполезной тратой времени? Новый код хуже, чем eval?
Обратите внимание, я также не хочу использовать символические ссылки, весь код должен работать в strict
. Текущее решение работает, поэтому я не ищу хаков, чтобы обойти то, что я делаю, я ищу лучшее решение (если оно существует).