2009-10-11 31 views
10

Ben Bir değişkeni Perl'de değişken adı olarak nasıl kullanabilirim?

printmsg(@val1, $msg1) if @val1; 
printmsg(@val2, $msg2) if @val2; 
printmsg(@val3, $msg3) if @val3; 
printmsg(@val4, $msg4) if @val4; 
printmsg(@val5, $msg5) if @val5; 
printmsg(@val6, $msg6) if @val6; 

Yani ben şu pasajı

for(my $i=1; $i < 6; $i++) { 
    printmsg(@val$i, $msg$i) if @val$i; 
} 

İşe ve hataları ile patlak vermez yazdı perl'de aşağıdaki başarmak gerekir.

+0

En azından hataları gösterebilirsiniz. –

cevap

4

Bunun gibi değişkenleri bir araya getiremezsiniz ve sonuç değişkenini elde edemezsiniz. $msg + i ifadesini değerlendirebildiniz, ancak msg dizisi oluşturup dizine eklediğinizde muhtemelen daha iyi: $msg[$i].

31

Whenever you find yourself postfixing variable names with an integer index, bunun yerine bir dizi kullanmış gerektiğini fark:

my @msgs = ('msg1', 'msg2', ..., 'msg6'); 
my @vals = ([ @val1 ], [ @val2 ], ..., [ @val6 ]); 

Ayrıca bkz SSS notlara cevap olarak How can I use a variable as a variable name?

, değişkenler bir tamsayı tarafından dizine değilse, bir yerine, sadece (%main:: gibi) paketin sembol tablo karma kullandığınız sembolik referansları kullanarak

: bir karma tabloyu kullanabilirsiniz kullanıcı tanımlı karma. Çözüm, kendi karma veya yerine gerçek bir referans kullanmaktır.

$USER_VARS{"fred"} = 23; 
my $varname = "fred"; 
$USER_VARS{$varname}++; # not $$varname++ 

Bir yılda en az bir kez tüm SSS listesini okumalısınız.

Güncelleme: Cevabım gereği sembolik referansları bilerek bıraktım çünkü sorunun bağlamında gereksiz ve muhtemelen çok zararlılar. Daha fazla bilgi için, bkz. Why it's stupid to 'use a variable as a variable name'?, part 2 ve part 3 tarafından mjd.

+3

Ya da val, sayısal olarak eşleşmiyorsa, karmaları kullanın: benim% errors = (foo => 'Uh oh!', bar => 'Daha da kötüsü!', ); $ Hatam için (% key key) { printmsg ($ errors {$ error}); } – Oesor

İlgili konular