2012-08-10 43 views
2

這是一個簡單的問題,但它讓我難倒,谷歌只是讓我誤入歧途。我想要做的就是打印一個散列的名字。例如:如何在Perl中打印散列名稱?

&my_sub(\%hash_named_bill); 

&my_sub(\%hash_named_frank); 

sub my_sub{ 

    my $passed_in_hash = shift; 

    # do great stuff with the hash here 

    print "You just did great stuff with: ". (insert hash name here); 

} 

我不知道的部分是如何獲取括號中的內容(插入...)。對於嵌套散列,你可以使用「keys」標籤來獲得散列名稱(如果你想稱它們的話)。我無法弄清楚如何獲得整個散列名稱,但它似乎只是另一個關鍵。

+1

你不能。子無法知道散列的名稱。 – 2012-08-10 17:55:51

+1

哈希沒有名稱,但指向它的變量,看看這篇文章,看看如何訪問變量名http://stackoverflow.com/questions/5199860/get-variable-name- as-string-in-perl – hackattack 2012-08-10 17:57:05

+1

我不認爲這是個好主意。這是Perl中可能的一種,但這並不意味着你應該這樣做。 – zostay 2012-08-10 18:16:04

回答

9

由於@hackattack中的評論稱,技術回答您的問題都可以在回答中發現Get variable name as string in Perl

但是,你應該考慮是否你正在做正確的事情?

如果你以某種方式需要知道散列的名字,你最有可能如果藏匿這些多個散列到會解決這個問題更好用的名字作爲鍵(你應該熟悉哈希的哈希值正如你暗示你的問題的方法)。

+0

不錯,謝謝你的提示。我試圖遞歸地使用子例程。我想我可以繼續在子例程中使用名稱構建散列? – 2012-08-10 18:16:49

+0

@ thomas.cloud - 非常正確。如果您需要與幫助,滴在一個新的問題與你正在試圖做什麼確切的細節:) – DVK 2012-08-10 18:21:55

+0

會做的好先生! – 2012-08-10 18:26:45

2
$hash_named_bill{name} = "bill"; 
$hash_named_frank{name} = "frank"; 

&my_sub(\%hash_named_bill); 
&my_sub(\%hash_named_frank); 

sub my_sub{ 

    my $passed_in_hash = shift; 

    # do great stuff with the hash here 

    print "You just did great stuff with: ". $passed_in_hash->{name}; 

} 
1

散列只是一塊內存,可以將一個名稱(或多個)與之關聯。

如果你想打印變量的名字,這不是很簡單(參見haccattack評論),以及沒有異味非常好(你確定你真的需要嗎?)

你也可以(如果這符合你的情況下)認爲「軟(或符號)引用」:

%hash1 = (x => 101, y => 501); 
%hash2 = (x => 102, y => 502); 

my_sub("hash1"); 
#my_sub(\%hash1); # won't work 
my_sub("hash2"); 

sub my_sub { 
     my $hashname = shift; 
     print "hash name: $hashname\n"; 
     print $hashname->{x} . "\n"; 
} 

這裏要傳遞給函數的名稱的變量,而不是(硬)引用。注意,在Perl中,這在取消引用時感覺是相同的(嘗試取消註釋my_sub(\%hash1);),儘管它是完全不同的事情。

+3

就像供參考:使用符號引用是一個巧妙的技巧,但通常被認爲是一件壞事,除非有充分的理由,否則不應在生產代碼中使用。 – DVK 2012-08-10 18:13:59

+2

如果你不'使用嚴格',這將起作用,我不會推薦。你可以使用'my_sub'中的'no strict'作爲折衷來關閉'my_sub'中的嚴格內部。 – zostay 2012-08-10 18:14:44

+0

變量是名稱和存儲之間的關聯。 「變量」是指關聯。變量不是被關聯的東西之一。固定。 – ikegami 2012-08-10 18:19:53

2

您可以使用名稱來引用散列,但散列本身沒有名稱。例如,考慮以下因素:記住

*foo = {}; 
*bar = \%foo; 
$foo{x} = 3; 
$bar{y} = 4; 

保持哈希包含(x=>3, y=>4):是哈希無名?命名爲'foo'?命名爲「酒吧」?上述所有的?以上都不是?

您可以做的最好的方法是使用PadWalker近似答案。我建議不要在生產中使用它或類似的東西(即任何能找到名字的東西)!