2012-06-19 61 views
1

我一直玩Perl的哈希。如預期了以下工作:如何從Perl中傳遞並返回哈希值?

use strict; 
use warnings; 

sub cat { 
     my $statsRef = shift; 
     my %stats = %$statsRef; 

     print $stats{"dd"}; 
     $stats{"dd"} = "DDD\n"; 
     print $stats{"dd"}; 
     return ("dd",%stats); 
} 

my %test; 
$test{"dd"} = "OMG OMG\n"; 

my ($testStr,%output) = cat (\%test); 
print $test{"dd"}; 

print "RETURN IS ".$output{"dd"} . " ORIG IS ". $test{"dd"}; 

輸出是:

OMG OMG 
DDD 
OMG OMG 
RETURN IS DDD 
ORIG IS OMG OMG 

當我添加一個數組到混合但它的錯誤了。

use strict; 
use warnings; sub cat { 
     my $statsRef = shift; 
     my %stats = %$statsRef; 

     print $stats{"dd"}; 
     $stats{"dd"} = "DDD\n"; 
     print $stats{"dd"};   return ("dd",("AAA","AAA"),%stats); } 
my %test; $test{"dd"} = "OMG OMG\n"; 

my ($testStr,@testArr,%output) = cat (\%test); 
print $test{"dd"}; 

print "RETURN IS ".$output{"dd"} . " ORIG IS ". $test{"dd"}. " TESTARR IS ". $testArr[0]; 

輸出是:

OMG OMG 
DDD 
OMG OMG 
Use of uninitialized value in concatenation (.) or string at omg.pl line 20. 
RETURN IS ORIG IS OMG OMG 
TESTARR IS AAA 

爲什麼陣列顯示,但散列是不是?

回答

7

所有列表都自動在Perl中展開。因此賦值運算符將無法神奇地區分子程序返回的列表之間的邊界。在你的情況下,這意味着@testArr將使用由cat給出的結果列表,並且%輸出將不會得到任何結果 - 因此是Use of unitialized value...警告。

如果需要返回一個哈希或數組具體而言,使用引用:

return ("dd", ["AAA", "AAA"], \%stats); 

...後來,在分配:

my ($testStr, $testArrayRef, $testHashRef) = cat(...); 
my @testArray = @$testArrayRef; 
my %testHash = %$testHashRef; 
4

除了答覆raina77ow我會強烈建議只傳遞有關的引用,而不是從類型轉換爲引用,然後再返回。這是一個更容易閱讀和麻煩代碼(恕我直言)少

use Data::Dumper; 
use strict; 
use warnings; 
sub cat { 
    my $statsRef = shift; 
    print $statsRef->{"dd"} ; 
    $statsRef->{"dd"} = "DDD\n"; 
    print $statsRef->{"dd"} ; 
    return ("dd",["AAA","AAA"],$statsRef); 
} 

my $test = {} ; 
$test->{"dd"} = "OMG OMG\n"; 

my ($var, $arrRef, $hashRef) = cat($test) ; 

print "var " . Dumper($var) . "\n" ; 
print "arrRef " . Dumper($arrRef) . "\n"; 
print "hashRef " . Dumper($hashRef) . "\n"; 
+2

+1引用是絕對可用,可能是乾淨的,但有時他們_do_混淆 - 特別是初學者。 ) – raina77ow