2013-07-12 19 views
1

我試圖從perl中獲得2個不同的哈希值。散列混入了子的輸出。這裏是我的簡化代碼:perl返回值從分數混合起來

#!/usr/bin/perl 

use strict; 
use warnings; 

sub sub1 { 
    my (%h1, %h2); 
    $h1{'1a'}++; 
    $h1{'1b'}++; 
    $h2{'2a'}++; 
    $h2{'2b'}++; 
    while ((my $key, my $value) = each %h1){ 
     print "key: $key, value: $value\n"; 
    } 
    print "\n"; 
    return (%h1, %h2); 
} 

my (%r1, %r2) = sub1(); 
while ((my $key, my $value) = each %r1){ 
    print "key: $key, value: $value\n"; 
} 

輸出:

key: 1b, value: 1 
key: 1a, value: 1 

key: 1b, value: 1 
key: 2a, value: 1 
key: 2b, value: 1 
key: 1a, value: 1 

這究竟是爲什麼?我該如何糾正它?謝謝。

回答

10

Perl是合併的兩個散列成一個,它們存儲在您的%r1變量,這將總是發生,除非您返回從子程序引用

sub sub1 { 
    my (%h1, %h2); 
    $h1{'1a'}++; 
    $h1{'1b'}++; 
    $h2{'2a'}++; 
    $h2{'2b'}++; 
    while ((my $key, my $value) = each %h1){ 
     print "key: $key, value: $value\n"; 
    } 
    print "\n"; 
    return (\%h1, \%h2); # \(backslash) creates a hashref 
} 

然後,你需要在標量的引用:

my ($r1, $r2) = sub1(); # scalar variables with references to %h1 and %h2 

# use %{ } to put $r1 in hash context 
while ((my $key, my $value) = each %{ $r1 }){ 
    print "key: $key, value: $value\n"; 
} 

# prints 
# key: 1b, value: 1 
# key: 1a, value: 1 

# key: 1b, value: 1 
# key: 1a, value: 1 
2

你或許應該在references閱讀起來。

Perl子例程可以獲取參數列表並返回一個列表。例如,如果我這樣做:

array_sub (@a, @b); 

sub array_sub { 
    return print join (": ", @_) . "\n"; 
} 

什麼,你會注意到的是,兩個數組傳遞將獲得合併成以下參數一個列表,沒有任何辦法告訴其中一個列表開始和另一個結束。

類似的事情發生的哈希值:

array_sub (%a, %b); 

sub array_sub { 
    return print join (": ", @_) . "\n"; 
} 

這將合併兩個哈希值(和它們的鍵)一起放入傳遞給子程序的單一列表。

要解決這個限制,可以使用引用基本上是指向一個內存位置標值,其中實際的數組或哈希生活:

array_sub { \@a, \@b); 

sub array_sub { 
    my $ref_a = shift; 
    my $ref_b = shift; 
    my @sub_a = @{ $ref_a }; 
    my @sub_b = @{ $ref_b }; 

在上面,我把一個反斜槓在陣列前面將參考添加到陣列中。到解除引用他們(即把他們回到陣列)我把@{...}圍繞參考。

你必須做你的代碼類似:

my ($r1, $r2) = sub1(); #Returns references; 
my @r1 = @{ $r1 }; #dereference 
my @r2 = @{ $r2 }; #dereference 

而在你的子程序:

sub sub1 { 
    ... 
    return \%h1, \%h2;