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]