Как я могу выполнить замены для нескольких переменных, имена которых я не знаю заранее? - PullRequest
1 голос
/ 21 июня 2009

Я работаю над сценарием Perl, в котором пользователь добавляет несколько установленных переменных в начале сценария, все с префиксом $XX, как показано ниже Пользовательские переменные, однако, должны пройти через короткую функцию преобразования, чтобы очистить их.

Есть ли способ запустить подпрограмму для всех переменных с префиксом $XX?

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: Я пытаюсь сделать это сейчас с помощью хэша, в соответствии с некоторыми предложениями в Google:

my %XX;

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

Затем я могу работать с ключами и значениями в for или while циклах. Однако как я могу переназначить каждую переменную преобразованной в цикле?

Редактировать еще раз: Понял. Этот цикл for успешно обрабатывает все переменные:

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

Я определенно собираюсь сейчас сделать файл конфигурации, как предложено ниже. Теперь я просто должен это выяснить:)

Ответы [ 4 ]

10 голосов
/ 21 июня 2009

Вместо того, чтобы пользователи редактировали источник и предоставляли нечетные имена переменных, используйте вместо этого файл конфигурации. Каждый пользователь может получить свой собственный файл конфигурации. В CPAN есть несколько модулей для обработки файлов конфигурации практически любого формата, и я расскажу о способах настройки программ Perl в главе Мастеринг Perl . Это, конечно, намного проще, чем трюки, которые вам понадобятся, чтобы волшебным образом подобрать эти имена переменных.

2 голосов
1 голос
/ 21 июня 2009

Просто для удовольствия. Но не делай этого, это зло: -)

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

Мой Perl немного ржавеет, поэтому есть более короткая / более чистая версия.

1 голос
/ 21 июня 2009
#!/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 "@_";
}
...