Perl 的 hash 變數相關實務驗證

這個問題所造成的 Bug 真的會很難抓.. 所以仔細了解一下 hash 的變數與實際驗證的結果整理如下:

  • 清除 hash 變數的方式
#!/usr/bin/perl
 
for ($i=0; $i<10; $i++) {
        #undef(%hash_test);
        #%hash_test={};
        #%hash_test=();
        $hash_test={};
        print $i.'a:['.$hash_test->{'test'}."]\n";
        $hash_test->{'test'}=time;
        sleep(1);
        print $i.'b:['.$hash_test->{'test'}."]\n";
}

必須要用 undef($hash_test), $hash_test={} 或 $hash_test=() 才可以真正清除掉, 否則內容還是存在.

清除 array 的語法剛好相反
  • @arr_t=(); 可以正確清除掉 arr_t 的陣列內容
  • $arr_t=(); 無法清除掉 arr_t 的陣列內容
  • hash 變數並不會因為在 sub 內的 local 宣告就回重新產生一份在 sub 內專屬的變數, 而是整體的變數
#!/usr/bin/perl
 
$hash_x->{'test'}='abc';
print("1:[".$hash_x->{'test'}."]\n");
change_hash('xyz');
print("2:[".$hash_x->{'test'}."]\n");
 
sub change_hash {
  local($p_value) = @_;
  local(%hash_x);
 
  $hash_x->{'test'}=$p_value;
  return;
}

結果如下

[apache@rdtest01 develop]$ perl /tmp/t4.pl
1:[abc]
2:[xyz]
  • tech/perl_clear_hash.txt
  • 上一次變更: 2008/12/25 10:21
  • jonathan