Ich muss einige Variablen in einem anderen Package lokalisieren, aber ich werde nicht wissen, wie ihre Namen lauten, bis sie übergeben werden. Meine Versuche, local
mit typeglobs zu verwenden, haben nicht funktioniert, also bin ich dazu übergegangen, den Wert der Variable zu speichern und manuell wiederherzustellen. Gibt es einen besseren Weg? Beachten Sie, dass die Fehlerüberprüfung, um zu sehen, ob eine Variable existiert, bevor man damit herumspielt, der Klarheit halber ausgelassen wurde.
#!/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" }
Ich versuche, ein eval wie dieses zu vermeiden:
my $eval = '';
for my $name (qw/foo bar baz/) {
$eval .= "local \$meta::$name = \$meta::$name * 2;\n";
}
eval "$eval meta::p()";
meta::p();
Ist es Zeitverschwendung, das eval zu vermeiden? Ist der neue Code schlechter als das eval?
Beachten Sie, dass ich auch keine symbolischen Referenzen verwenden möchte, alle Code-Zeilen müssen unter strict
funktionieren. Die aktuelle Lösung funktioniert, daher suche ich nicht nach Hacks, um zu umgehen, was ich tue. Ich suche nach einer besseren Lösung (falls eine existiert).