有關 reference 的一個奇妙現象
原本在工作站上發現一個有關 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
03/11 16:11, 1F
推
03/11 16:23, , 2F
03/11 16:23, 2F
→
03/11 16:27, , 3F
03/11 16:27, 3F
→
03/11 16:34, , 4F
03/11 16:34, 4F
→
03/11 16:35, , 5F
03/11 16:35, 5F
→
03/11 16:36, , 6F
03/11 16:36, 6F
→
03/11 16:38, , 7F
03/11 16:38, 7F
Perl 近期熱門文章
PTT數位生活區 即時熱門文章