有關 reference 的一個奇妙現象

看板Perl作者 (零式札克)時間18年前 (2007/03/11 15:47), 編輯推噓2(205)
留言7則, 2人參與, 最新討論串1/1
原本在工作站上發現一個有關 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)

03/11 16:11, , 1F
很正常阿 那是@a=@c 那是copy to new(another) array
03/11 16:11, 1F

03/11 16:23, , 2F
原來真是我一直誤會他會改同樣記憶體位置的數值 :o
03/11 16:23, 2F

03/11 16:27, , 3F
在碰到這個 case 之前我一直是這麼認為的 Orz
03/11 16:27, 3F

03/11 16:34, , 4F
剛剛又試了一下 奇怪的是印出 \@a 的值
03/11 16:34, 4F

03/11 16:35, , 5F
在寫 @a = @c; 前後, \@a 的值依然是相同的耶 :o
03/11 16:35, 5F

03/11 16:36, , 6F
還是說 \@a, \$a[i] 其實並沒有絕對的關聯
03/11 16:36, 6F

03/11 16:38, , 7F
屬於 @a 的 $a[i] 的位置在內部其實是會變動的
03/11 16:38, 7F
文章代碼(AID): #15yxGg9B (Perl)
文章代碼(AID): #15yxGg9B (Perl)