我需要本地化一些變量到另一個包中,但我不知道他們的名字是什麼,直到他們通過。我嘗試使用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浪費時間嗎?新代碼比eval更糟糕嗎?
請注意,我也不想使用符號引用,所有代碼必須在strict
下工作。目前的解決方案的工作原理,所以我不尋找黑客來解決我在做什麼,我正在尋找更好的解決方案(如果存在的話)。
我應該放在那裏,我不想使用符號引用。 – 2009-04-27 15:49:41