Perl 如何对名称不为的多个变量执行替换';我不能提前知道吗?

Perl 如何对名称不为的多个变量执行替换';我不能提前知道吗?,perl,variables,configuration-files,Perl,Variables,Configuration Files,我正在编写一个Perl脚本,其中用户在脚本的开头添加了许多设置变量,所有变量的前缀都是$XX,如下所示。然而,用户设置的变量需要经过一个简短的转换函数来清理它们 有没有办法在所有带有$XX前缀的变量上运行sub my $XXvar1 = "something"; my $XXvar2 = "something"; my $XXvar3 = "something"; my $XXvar4 = "something"; sub processVar { my $fixVar = $_[0]

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

不过,我现在肯定会尝试创建一个配置文件,如下所示。现在我必须弄清楚:)

用户不用编辑源代码并提供奇数变量名,而是使用配置文件。每个用户都可以获得自己的配置文件。上有几个模块可以处理几乎任何格式的配置文件,我在本教程的一章中介绍了配置Perl程序的方法。当然,这比神奇地获取这些变量名所需的技巧要简单得多。

用户不必编辑源代码并提供奇怪的变量名,而是使用配置文件。每个用户都可以获得自己的配置文件。上有几个模块可以处理几乎任何格式的配置文件,我在本教程的一章中介绍了配置Perl程序的方法。这当然比神奇地获取这些变量名所需的技巧简单得多。

阅读MJD的:

  • 阅读美赞臣的:


  • 只是为了好玩。但不要这样做,这是邪恶的:-)


    我的Perl有点过时了,所以有一个更短/更干净的版本。

    只是为了好玩。但不要这样做,这是邪恶的:-)


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

    是的,在源代码中包含配置文件本身有点不可靠。这是那一章的修改版本的链接是的,在源代码中有配置文件本身有点不可靠。这是该章修改版本的链接,请参见地图功能,请参见地图功能,这是注释可编辑的另一个证明。(按原样,你只能删除然后再添加一个。但如果我在这里这样做,我的评论将在你的回复下,这毫无意义。所以我的打字错误将永远保留。Feh。)这又是一个证据,证明评论应该是可编辑的。(照目前的情况,你只能删除然后再添加一个。但是如果我在这里这样做,我的评论将在你的回复下,这毫无意义。所以我的打字错误将永远保留。呸。)
    #!/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 "@_";
    }
    
    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