我正在编写一个Perl脚本,用户在脚本开头添加了许多设置变量,所有这些变量都以$XX
为前缀,如下所示。但是,用户设置变量需要通过一个简短的转换函数来清理它们。
有没有办法在$XX
前缀的所有变量上运行sub?
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*);
修改 根据谷歌的一些建议,我现在正试着用哈希做这个:
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});
}
我现在肯定会尝试制作配置文件,如下所示。现在我只需要弄明白:)
答案 0 :(得分:10)
而不是用户编辑源并提供奇数变量名称,而是使用配置文件。每个用户都可以获得自己的配置文件。 CPAN上有几个模块可以处理几乎任何格式的配置文件,我在Mastering Perl的章节中讨论了配置Perl程序的方法。它肯定比你需要做的技巧更容易获取这些变量名称。
答案 1 :(得分:2)
答案 2 :(得分:1)
#!/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 "@_";
}
答案 3 :(得分:1)
只为了它的乐趣。但不要这样做是邪恶的: - )
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
My Perl有点生疏,所以它的版本更短/更干净。