使用者工具

網站工具


tech:perl_sub_hash

perl 副程式傳遞多個 hash 實作

Perl 傳遞參數給副程式是採用 array 的方式將各個參數傳遞過去, 所以當要傳的參數有多個 array 或 hash 時, 就會出現問題, 在 perlsub 參考解決方案中, 是提出 array 的方法如下:

($aref, $bref) = func(\@c, \@d);
print "@$aref has more than @$bref\n";
 
sub func {
    my ($cref, $dref) = @_;
    if (@$cref > @$dref) {
        return ($cref, $dref);
    } else {
        return ($dref, $cref);
    }
}

但我現在大量使用 hash 方式, 所以花了一些時間, 試出來以下的範例:

#!/usr/bin/perl
use Data::Dumper;
 
$hash_h1->{'id'}='hash_h1';
$hash_h2->{'id'}='hash_h2';
$hash_h1->{'main'}->{'temp'}='Insert by main!';
print Dumper($hash_h1);
print Dumper($hash_h2);
($hash_h2, $hash_h1) = mysub1(\$hash_h1, \$hash_h2);
print Dumper($hash_h1);
print Dumper($hash_h2);
 
sub mysub1 {
    local($hash1, $hash2) = @_;
 
    $$hash1->{'main'}->{'temp'}='hash1 Update by mysub1:'.time;
    $$hash2->{'main'}->{'temp'}='hash2 Update by mysub1:'.time;
 
    return($$hash1, $$hash2);
}

呼叫 mysub1() 前:

$hash_h1 = {
          'id' => 'hash_h1',
          'main' => {
                      'temp' => 'Insert by main!'
                    }
        };
$hash_h2 = {
          'id' => 'hash_h2'
        };

呼叫 mysub1() 後:

$hash_h1 = {
          'id' => 'hash_h2',
          'main' => {
                      'temp' => 'hash2 Update by mysub1:1229088705'
                    }
        };
$hash_h2 = {
          'id' => 'hash_h1',
          'main' => {
                      'temp' => 'hash1 Update by mysub1:1229088705'
                    }
        };
  • 重點在呼叫時的 hash 參數變數要加上 \

Exp. ($hash_h2, $hash_h1) = mysub1(\$hash_h1, \$hash_h2);

  • 在副程式內所使用的 hash 變數因為都是 ref 所以必須在變數前加上 $ 轉回

Exp. $$hash1→{'main'}→{'temp'}='hash1 Update by mysub1:'.time;

  • 副程式要回傳處理結果時, 也必須加上 $ 轉回

Exp. return($$hash1, $$hash2);

參考網路資料頁面

tech/perl_sub_hash.txt · 上一次變更: 2008/12/12 21:43 由 jonathan