2009-06-21 57 views
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"; 

我可以用鍵和值在for然後工作或while循環。但是,如何將每個變量重新分配給循環中的轉換後的變量?

再次編輯: 明白了。這for循環處理成功的所有變量:

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

我一定要去嘗試做一個配置文件現在,雖然如下建議。現在我只需要弄清楚:)

+1

爲什麼你不使用數組? – 2009-06-21 13:12:36

+0

另請參見地圖功能http://perldoc.perl.org/5.8.8/functions/map.html – 2009-06-21 14:04:05

回答

10

而不是用戶編輯源代碼並提供奇數變量名稱,而是使用配置文件。每個用戶都可以獲得他自己的配置文件。 CPAN上有幾個模塊可以處理幾乎任何格式的配置文件,並且我將討論如何在Mastering Perl的章節中配置Perl程序。這當然比想要魔法拾取這些變量名的技巧容易得多。

+0

是的,在源本身的配置文件有點不順。 http://search.cpan.org/search?query=ini&mode=all – 2009-06-21 13:44:24

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 "@_"; 
} 
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是有點生疏,所以有狡猾的是它的一個更短或更乾淨的版本。