作者reizarc (零式札克)
看板perl
標題有關 reference 的一個奇妙現象
時間Sun Mar 11 15:47:53 2007
原本在工作站上發現一個有關 Perl 的奇怪 bug,
後來試了 Win32, Linux, Solaris 等等平台上的 Perl 5.8
發現都會有相同的奇怪結果
因為說是 Perl 的問題可能也不對 :o
總之我把問題整理成一小段 code 放在下面,
如果是我觀念上的問題或是 Perl 跑出不同的結果, 請不吝指正
############################################################################
@a = ( 1, 2, 3, 4, 5 );
@b = ( 10, 20, 30, 40, 50 );
@c = ( 100, 200, 300, 400, 500 );
$r = \$a[ 2 ]; # $r ref 到 $a[ 2 ] 這個位置
print $a[ 2 ], " ", $$r, $/; # 會印出 "3 3", ok
@a[ 0 .. 4 ] = @b; # @a 數值取自 @b
print $a[ 2 ], " ", $$r, $/; # 印出 "30 30", ok
@a = @c; # @a 數值取自 @c
print $a[ 2 ], " ", $$r, $/; # 印出 "300 30", 喔呀 ... ?
$c[ 2 ] = -300; # 該不會 \@a = \@c 去了 ... ?
print $a[ 2 ], " ", $$r, $/; # 印出 "300 30", 唔 ... 不知道到哪裡去了 ...
#############################################################################
從這些現象 先說說我的想法
@a[ 0 .. 4 ] = @b; 的情況下,
$a[ i ] 變數依然在相同的記憶體位置, 但是只有值更改
@a = @c; 的情況下,
Perl 先將 @c 整個 copy 到某個位置, 再把原本的 \@a 換到新的位置
但是因為 $r 的位置還在原本的 $a[ 2 ] 上
所以造成這個奇怪的現象
在 C++ STL 中,
我們知道 std::vector 也會有類似的 memory re-allocate 的動作
但是在 Perl array 語法中已經盡量隱藏記憶體細節的情況下
不知道為什麼內部還是會有這個現象就是了 ...
... 看來大家使用 reference 的時候還是要小心一點 >w<
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.216.174.26
※ 編輯: reizarc 來自: 61.216.174.26 (03/11 15:51)
※ 編輯: reizarc 來自: 61.216.174.26 (03/11 15:56)
※ 編輯: reizarc 來自: 61.216.174.26 (03/11 16:00)
※ 編輯: reizarc 來自: 61.216.174.26 (03/11 16:01)
推 LiloHuang:很正常阿 那是@a=@c 那是copy to new(another) array 03/11 16:11
推 reizarc:原來真是我一直誤會他會改同樣記憶體位置的數值 :o 03/11 16:23
→ reizarc:在碰到這個 case 之前我一直是這麼認為的 Orz 03/11 16:27
→ reizarc:剛剛又試了一下 奇怪的是印出 \@a 的值 03/11 16:34
→ reizarc:在寫 @a = @c; 前後, \@a 的值依然是相同的耶 :o 03/11 16:35
→ reizarc:還是說 \@a, \$a[i] 其實並沒有絕對的關聯 03/11 16:36
→ reizarc:屬於 @a 的 $a[i] 的位置在內部其實是會變動的 03/11 16:38