Wie kann ich eine Substitution auf mehreren Variablen, deren Namen durchführen, weiß ich nicht vor der Zeit?

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

Frage

Ich arbeite an einem Perl-Skript, wo der Benutzer am Anfang des Skripts eine Reihe von Setvariablen fügt hinzu, alle mit $XX Präfix, wie unten zu sehen. Die vom Anwender eingestellten Variablen müssen jedoch durch eine kurze Transformationsfunktion gehen, um sie zu reinigen.

Gibt es eine Möglichkeit, die Unter auf alle Variablen mit dem Präfix $XX laufen?

my $XXvar1 = "something";
my $XXvar2 = "something";
my $XXvar3 = "something";
my $XXvar4 = "something";

sub processVar {
    my $fixVar = $_[0];
    # Do stuff
    return $fixVar;
}

# This obviously doesn't work. Use some kind of loop or something? How...
$XXvar* = processVar($XXvar*);

Edit: Ich versuche, mit einem Hash dies jetzt zu tun, wie pro einige Vorschläge auf Google:

my %XX;

$XX{var1} = "something 1";
$XX{var2} = "something 2";
$XX{var3} = "something 3";
$XX{var4} = "something 4";

Ich kann dann mit den Schlüsseln und Werten in for oder while Schleifen arbeiten. Aber wie kann ich zuweisen jede Variable in die umgewandelte in der Schleife?

Bearbeiten wieder: Verstanden. Diese for Schleife verarbeitet alle Variablen erfolgreich:

for my $key ( keys %XX ) {
    $XX{$key} = processVar($XX{$key});
}

Ich werde auf jeden Fall versuchen jetzt eine Konfigurationsdatei zu machen, obwohl, wie unten vorgeschlagen. Jetzt muss ich nur entscheiden, dass out:)

War es hilfreich?

Lösung

Statt Benutzer die Quelle Bearbeitung und ungerade Variablennamen bereitstellt, verwenden Sie stattdessen eine Konfigurationsdatei. Jeder Benutzer kann seine eigene Konfigurationsdatei erhalten. Es gibt mehrere Module auf CPAN Konfigurationsdateien von fast jedem Format zu handhaben, und ich sprechen über Möglichkeiten, Perl zu konfigurieren Programme in einem Kapitel von Mastering Perl . Es ist sicherlich viel einfacher als die Tricks, die Sie auf magische Weise zu tun bräuchten, um diese Variablennamen aufzunehmen.

Andere Tipps

#!/usr/bin/perl

use strict;
use warnings;

my $XXvar1 = "something";
my $XXvar2 = "something";
my $XXvar3 = "something";
my $XXvar4 = "something";

my @values;
for ( 1 .. 4 ) {
    push @values, eval '$XXvar' . $_;
}

processVar(@values);

sub processVar {
    print "@_";
}

Nur für den Spaß von ihm. Aber dies nicht tun, es ist böse: -)

use PadWalker qw(peek_my peek_our peek_sub closed_over);
my $XXvar1 = "something1a";
my $XXvar2 = "something2b";
my $XXvar3 = "something3c";
my $XXvar4 = "something4d";
my $noXXvar = "something5e";

#remove last character
sub clean {
  my $h = peek_my(1);
  while(my ($key, $value) = each(%$h)) {
    if ($key =~ /^\$XXvar.+/) {
       chop ${$h->{$key}}
    }
  }
}
clean();

print "$XXvar1\n";  //something1
print "$XXvar2\n";  //something2
print "$XXvar3\n";  //something3
print "$XXvar4\n";  //something4
print "$noXXvar\n"; //something5e

Mein Perl ist ein bisschen rostig, so gibt es unwirsch ist eine kürzere / sauberere Version davon.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top