用hash引用時別忘了初始化

2021-04-25 11:11:27 字數 1147 閱讀 5642

相信很多人都寫過下面這種函式,把引數當作hash引用來賦值:

sub foo  = 'bar';

}

然後這樣呼叫:

foo($a);
呼叫之後,$a就變成了乙個hash引用,裡面包含了 foo => 'bar' 這一對值。當然你可能會說,幹嘛要在foo裡面修改引數,直接return $hash不行嗎。當然可以,而且我也推薦使用return的方式,不過有時候foo函式可能會很複雜,或者由於其他的原因而不得不使用修改引數的方式。

且慢!這種用法有時候會會失敗。看下面的例子:

#!/usr/bin/perl

use data::dumper;

sub foo = 'world!';

}my $a;

my $b = {};

foo($a); print dumper($a);

foo($b); print dumper($b);

執行結果:

$var1 = undef;

$var1 = ;

為什麼$a執行foo後仍然為undef,而$b就有值?

這是因為,my $a; 沒有對$a初始化,此時$a的值為undef。而呼叫foo時,引數實際上是傳值呼叫,$a的undef值被賦給了$h變數,此時$h = undef。而下一行將$h作為hash引用賦值時,系統會自動為$h賦乙個空引用作為初始值。 ——但是,這個空引用以及接下來賦給的 hello => 'world!' 的值不會傳回給外面的 $a,因為是值傳遞!

而$b則不同,初始化成乙個空hash引用,這樣傳遞給foo的就是個真正的引用值,這樣 hello => 'world!'的賦值可以賦給該引用。

所以,在使用hash引用時,初始化是非常必要的。

標籤: perl |

分類: perl程式設計 |

引用通告 |

新增到del.icio.us |

頁面頂端

#1smallfish

2008-10-10 17:22

不僅是hash,其他也一樣。

至少你可以明白你定義的這個變數是屬於哪個型別。

只是定義my $a;這樣,以後自己看了也費事。

如果是my $a=0;至少能明白這裡是個數值,$a={],$a=()。都能看上明白點哦。

學習了。。

字串 用陣列初始化和用指標初始化方法

1 字串陣列初始化 1 用足夠的空間的陣列儲存字母串 const char example 40 so big it is.const表示不會更改這個字母串 還有這種 const char example 40 注意最後的空字元 0 沒有這個空字元,這就不是乙個字串,而是乙個字元陣列。2 讓編譯器確...

普通引用和const引用的初始化

普通引用和const引用的初始化 當引用的初始式是乙個左值 是乙個物件,你可以取得他的位址 時,其初始化就是非常簡單的事情。普通t 的初始式必須是乙個t型別的。而cosnt t 則不必是乙個左值,甚至可以不是t型別的。在這樣的情況下,經過以下幾個步驟。1 首先,如果需要的話,將應用到型別t的隱式型別...

字串 用陣列初始化和用指標初始化方法區別

const char ptr1 fine.const char ar fine.以上的宣告中,ptr1和ar都是該字串的位址,但這兩種形式並不完全相同。初始化陣列 字串儲存在靜態儲存區。但是,程式在開始執行時才會為該陣列分配內 存 以上面的宣告為例,陣列形式ar 在計算機的記憶體中分配為乙個內含6 ...