¿Cómo puedo realizar sustituciones en múltiples variables cuyos nombres no conozco de antemano?

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

Pregunta

Estoy trabajando en un script de Perl donde el usuario agrega una serie de variables establecidas al comienzo del script, todas con el prefijo $ XX , como se ve a continuación. Sin embargo, las variables establecidas por el usuario deben pasar por una función de transformación corta para limpiarlas.

¿Hay alguna manera de ejecutar el sub en todas las variables con el prefijo $ XX ?

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

sub processVar {
    my $fixVar = 

Estoy trabajando en un script de Perl donde el usuario agrega una serie de variables establecidas al comienzo del script, todas con el prefijo $ XX , como se ve a continuación. Sin embargo, las variables establecidas por el usuario deben pasar por una función de transformación corta para limpiarlas.

¿Hay alguna manera de ejecutar el sub en todas las variables con el prefijo $ XX ?

my %XX;

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

Editar: Estoy tratando de hacer esto ahora con un hash, según algunas sugerencias en Google:

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

Entonces puedo trabajar con las teclas y valores en para o while bucles. Sin embargo, ¿cómo puedo reasignar cada variable a la transformada en el bucle?

Editar de nuevo: Lo tengo. Este bucle for procesa todas las variables con éxito:

<*>

Definitivamente voy a intentar crear un archivo de configuración ahora, como se sugiere a continuación. Ahora solo tengo que resolver eso :)

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

Editar: Estoy tratando de hacer esto ahora con un hash, según algunas sugerencias en Google:

<*>

Entonces puedo trabajar con las teclas y valores en para o while bucles. Sin embargo, ¿cómo puedo reasignar cada variable a la transformada en el bucle?

Editar de nuevo: Lo tengo. Este bucle for procesa todas las variables con éxito:

<*>

Definitivamente voy a intentar crear un archivo de configuración ahora, como se sugiere a continuación. Ahora solo tengo que resolver eso :)

¿Fue útil?

Solución

En lugar de que los usuarios editen la fuente y proporcionen nombres de variables impares, use un archivo de configuración. Cada usuario puede obtener su propio archivo de configuración. Hay varios módulos en CPAN para manejar archivos de configuración de casi cualquier formato, y hablo sobre formas de configurar Perl programas en un capítulo de Mastering Perl . Ciertamente es mucho más fácil que los trucos que necesitarías hacer para recoger mágicamente estos nombres de variables.

Otros consejos

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

Solo por el gusto de hacerlo. Pero no hagas esto, es malo :-)

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

Mi Perl está un poco oxidado, por lo que hay una versión más corta / limpia del mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top