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);