2010-02-17 74 views
6

我仍然試圖解決我的散列解引用。我目前的問題是我現在將一個hashref傳遞給一個sub,並且我想在該sub中解引用它。但是我沒有找到正確的方法/語法來做到這一點。在sub中,我想要迭代散列鍵,但是hashref的語法與散列不同,我知道該怎麼做。如何取消引用已傳遞給子例程的Perl哈希引用?

所以,我要的是要做到這一點:

sub foo { 
    %parms = @_; 
    foreach $keys (key %parms) { # do something }; 
} 

但有hashref中,而不是一個哈希傳遞。

任何指針(雙關不打算)是受歡迎的。

謝謝。

回答

3

我沒有帶實際測試的代碼在這個時候,但是寫寫意你會想要做這樣的事情:

sub foo { 
    $parms = shift; 
    foreach my $key (keys %$parms) { # do something }; 
} 
+0

使用移位而不是@_做了訣竅,當然,使用標量而不是變量的散列。工作代碼: sub foo {$} parms = shift; foreach $ key(keys%$ parms){print「$ key:$$ parms {$ key} \ n」; } } 謝謝! – sgsax 2010-02-17 17:52:03

+4

'$ parms - > {$ key}'可能比'$$ parms {$ key}' – toolic 2010-02-17 18:00:28

+1

'shift'稍微偏好''_ _'不相關。 'my($ hashref)= @_;'也可以。 – 2010-02-18 00:43:08

2

這裏有一種方法取消引用哈希值裁判傳遞給子:

use warnings; 
use strict; 

my %pars = (a=>1, b=>2); 
foo(\%pars); 
sub foo { 
    my ($href) = @_; 
    foreach my $keys (keys %{$href}) { print "$keys\n" } 
} 

__END__ 
a 
b 

又見References quick referenceperlreftut

+1

感謝您的鏈接。我一直在尋找perlreftut頁面等等,但我仍然試圖將它全部弄清楚。 – sgsax 2010-02-17 17:54:28

2

sub foo 
{ 
    my $params = $_[0]; 
    my %hash = %$params; 
     foreach $keys (keys %hash) 
     { 
     print $keys; 
     } 
} 

my $hash_ref = {name => 'Becky', age => 23}; 

foo($hash_ref); 

而且關於參考文獻的一個很好的介紹是here

+0

感謝您的鏈接。我一直在用它作爲參考,但我還沒有完全掌握它。 – sgsax 2010-02-17 17:53:03

1
#!/usr/bin/perl 
use strict; 

my %params = (
    date => '2010-02-17', 
    time => '1610', 
); 

foo(\%params); 

sub foo { 
    my ($params) = @_; 
    foreach my $key (keys %$params) { 
     # Do something 
     print "KEY: $key VALUE: $params{$key}\n"; 
    }; 
} 
+0

Eep,直到現在纔看到工具回覆。 ; x – 2010-02-18 00:13:47

+0

我會說他的命名更好(將hashref命名爲href)。 – 2010-02-18 00:14:39