2010-02-22 907 views
1

如果我有一個變量,$bar,它等於字符串"foo"$foo等於0xdead,我怎樣才能得到$foo的值,而我只有變量名的字符串?如何在Perl中使用變量的值作爲變量名?

從本質上講,我想做一種指針間接的對全局命名空間還是全局命名空間的哈希查找。

下不工作:

perl -e 'my $foo=0xdead; my $bar ="foo"; print ${$bar}."\n";' 

它只打印的換行符。

+1

在你踏上這條路之前,請確保你閱讀了所有這些內容:http://perl.plover.com/varvarname.html。 – FMc 2010-02-22 22:20:19

+1

另請參閱http://stackoverflow.com/questions/1549685/how-can-i-use-a-variable-as-a-variable-name-in-perl/1549695#1549695 ...哦,和,* *你不應該這樣做。** – 2010-02-22 22:58:00

回答

7

這一招僅適用於全局變量(符號引用尋求當前包的symbol table),我。即

perl -e '$foo=0xdead; my $bar ="foo"; print ${$bar}."\n";' 

如果你想捕獲的詞彙,你將不得不使用eval ""

perl -e 'my $foo=0xdead; my $bar ="foo"; print eval("\$$bar"),"\n";' 

但使用eval ""無目的被認爲是不好的風格在Perl,以及使用全局變量。考慮使用真實的參考(如果可以的話)。

4

有非常非常非常珍貴在Perl少數情況下,必須使用符號引用。在所有其他情況下避免符號引用不是關於樣式。這是一個聰明的程序員。作爲mjd解釋Why it's stupid to "use a variable as a variable name"

問題代碼的真正根源是:它的脆弱。當你這樣做的時候,你和事情不一樣。如果兩個不同的事情碰巧有相同的名字,他們會碰撞,你會得到錯誤的答案。所以你最終得到一長串名字,你必須小心不要重複使用,如果你搞砸了,你會得到一個非常奇怪的錯誤。這正是命名空間被髮明要解決的問題,而這正是一個散列:一個可移植的命名空間。

另請參閱Part 2Part 3

+0

我的目標是迭代一堆變量,並且如果任何變量設置爲某個值,我想報告該變量名稱。因此我需要變量值和變量名稱。 – 2010-02-22 23:32:07

+3

@羅斯羅傑斯這些變量有點相關嗎?想必。然後,**使用散列**。這就是符號表:哈希。 – 2010-02-23 00:06:03

+0

我與一箇舊的自定義選項解析器接口,該解析器將其值存儲在全局名稱空間中。如果我有我的方式,我們不會使用我們自己的自定義選項解析器,而是使用parseopts。 – 2010-02-23 00:12:28

相關問題