Comment puis-je effectuer des substitutions sur plusieurs variables dont je ne connais pas les noms à l'avance?

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

Question

Je travaille sur un script Perl dans lequel l'utilisateur ajoute un certain nombre de variables définies au début du script, le préfixe $ XX , comme indiqué ci-dessous. Les variables définies par l'utilisateur doivent toutefois passer par une courte fonction de transformation pour les nettoyer.

Est-il possible d'exécuter le sous-programme sur toutes les variables avec le préfixe $ XX ?

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

sub processVar {
    my $fixVar = 

Je travaille sur un script Perl dans lequel l'utilisateur ajoute un certain nombre de variables définies au début du script, le préfixe $ XX , comme indiqué ci-dessous. Les variables définies par l'utilisateur doivent toutefois passer par une courte fonction de transformation pour les nettoyer.

Est-il possible d'exécuter le sous-programme sur toutes les variables avec le préfixe $ XX ?

my %XX;

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

Modifier: J'essaie de le faire maintenant avec un hachage, selon certaines suggestions sur Google:

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

Je peux alors utiliser les clés et les valeurs dans pour ou pendant que effectue une boucle. Cependant, comment puis-je réaffecter chaque variable à celle transformée dans la boucle?

Modifier à nouveau: Je l'ai. Cette boucle for traite toutes les variables avec succès:

<*>

Je vais certainement essayer de créer un fichier de configuration maintenant, comme suggéré ci-dessous. Maintenant, je dois juste comprendre cela:)

[0]; # Do stuff return $fixVar; } # This obviously doesn't work. Use some kind of loop or something? How... $XXvar* = processVar($XXvar*);

Modifier: J'essaie de le faire maintenant avec un hachage, selon certaines suggestions sur Google:

<*>

Je peux alors utiliser les clés et les valeurs dans pour ou pendant que effectue une boucle. Cependant, comment puis-je réaffecter chaque variable à celle transformée dans la boucle?

Modifier à nouveau: Je l'ai. Cette boucle for traite toutes les variables avec succès:

<*>

Je vais certainement essayer de créer un fichier de configuration maintenant, comme suggéré ci-dessous. Maintenant, je dois juste comprendre cela:)

Était-ce utile?

La solution

Au lieu de modifier la source et de fournir des noms de variables impairs, utilisez plutôt un fichier de configuration. Chaque utilisateur peut obtenir son propre fichier de configuration. Il existe plusieurs modules sur le CPAN pour gérer les fichiers de configuration de n’importe quel format, et je discute des moyens de configurer Perl. programmes dans un chapitre de Maîtriser Perl . C’est certainement beaucoup plus facile que les astuces dont vous auriez besoin pour récupérer par magie ces noms de variables.

Autres conseils

#!/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 "@_";
}

Juste pour le plaisir. Mais ne fais pas ça, c'est maléfique: -)

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

Mon Perl est un peu rouillé, il en existe donc une version plus courte / plus propre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top