傳遞哈希和數組的最好方法是reference。參考僅僅是一種將複雜數據結構作爲單個數據點來討論的方式 - 可以存儲在標量變量(如$foo
)中的東西。
請閱讀references,以便您瞭解如何創建參考文件並取消參考以獲取原始數據。
非常基礎:您在數據結構之前加上一個反斜槓,以便將引用引用到該結構中。
my $hash_ref = \%hash;
my $array_ref = \@array;
my $scalar_ref = \$scalar; #Legal, but doesn't do much for you...
的引用是原始結構的存儲位置(加上一個關於結構線索):
print "$hash_ref\n";
將打印類似:
HASH(0x7f9b0a843708)
要獲得基準迴轉換爲可用格式,您只需將參考文件放在前面的正確sigil即可:
my %new_hash = %{ $hash_ref };
您應該瞭解如何使用引用,因爲這是您可以在Perl中創建極其複雜的數據結構以及面向對象的Perl如何工作的方式。
假設您想要將三個哈希值傳遞給您的子程序。這裏有三個散列:
my %hash1 = (this => 1, that => 2, the => 3, other => 4);
my %hash2 = (tom => 10, dick => 20, harry => 30);
my %hash3 = (no => 100, man => 200, is => 300, an => 400, island => 500);
,我會爲他們創造
my $hash_ref1 = \%hash1;
my $hash_ref2 = \%hash2;
my $hash_ref3 = \%hash3;
而且現在引用剛剛通過引用:
mysub ($hash_ref1, $hash_ref2, $hash_ref3);
的參考文獻標數據,所以將它們傳遞給我的子程序沒有任何問題:
sub mysub {
my $sub_hash_ref1 = shift;
my $sub_hash_ref2 = shift;
my $sub_hash_ref3 = shift;
現在,我只是提領他們,我的子程序可以使用它們。
my %sub_hash1 = %{ $sub_hash_ref1 };
my %sub_hash2 = %{ $sub_hash_ref2 };
my %sub_hash3 = %{ $sub_hash_ref3 };
你可以看到一個參考是什麼參考使用ref命令:
my $ref_type = ref $sub_hash_ref; # $ref_type is now equal to "HASH"
如果你想確保你傳遞的正確類型的數據結構,這是有用。
sub mysub {
my $hash_ref = shift;
if (ref $hash_ref ne "HASH") {
croak qq(You need to pass in a hash reference);
}
另外請注意,這些內存引用,因此修改引用將修改原來的哈希:
my %hash = (this => 1, is => 2, a => 3 test => 4);
print "$hash{test}\n"; # Printing "4" as expected
sub mysub (\%hash); # Passing the reference
print "$hash{test}\n"; # This is printing "foo". See subroutine:
sub mysub {
my $hash_ref = shift;
$hash_ref->{test} = "foo"; This is modifying the original hash!
}
這可能是很好的 - 它可以讓你修改傳遞給子程序的數據,或不好 - 它允許你無意中將修改數據傳遞給原來的子程序。
`&`通常是可選的,並且由於Perl生成默認參數的方式(通常)不是最佳實踐,因此它不被棄用。有時它是必需的,有時它不是必需的,但它仍然可以使代碼更具可讀性。 – mob 2011-02-04 00:03:13
您,先生,技術上是正確的:最好的一種正確的。我已經澄清了我對此的評論。 – 2011-02-04 00:52:17
不*「也許更老」*。在1993年2月05日的最後一個perl4版本4.036中,函數調用中通常需要**。相信我,我在那裏。 ☺避免這種情況的唯一方法是使用`do mysubname()`語法 - 順便說一下,它仍然可以正常工作,這對於那些偶然發現的少數人來說是驚喜。或者在它之上。 – tchrist 2011-02-04 01:07:57