1

我正在编写一个 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";

然后我可以使用fororwhile循环中的键和值。但是,如何在循环中将每个变量重新分配给转换后的变量?

再次编辑: 知道了。此for循环成功处理所有变量:

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

不过,我现在肯定会尝试制作一个配置文件,如下所示。现在我只需要弄清楚:)

4

4 回答 4

10

与其让用户编辑源代码并提供奇怪的变量名称,不如使用配置文件。每个用户都可以获得自己的配置文件。CPAN上有几个模块可以处理几乎任何格式的配置文件,我在Mastering Perl的一章中讨论了配置 Perl 程序的方法。这肯定比您神奇地获取这些变量名所需的技巧要容易得多。

于 2009-06-21T13:38:39.133 回答
2

阅读 MJD 的:

  1. 为什么“使用变量作为变量名”是愚蠢的
  2. 第2部分
  3. 第 3 部分
于 2009-06-21T13:43:24.680 回答
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 "@_";
}
于 2009-06-21T13:20:56.970 回答
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

我的 Perl 有点生疏,所以它有一个更短/更干净的版本。

于 2009-06-21T14:43:16.663 回答