作者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)
1F:推 LiloHuang:很正常阿 那是@a=@c 那是copy to new(another) array 03/11 16:11
2F:推 reizarc:原来真是我一直误会他会改同样记忆体位置的数值 :o 03/11 16:23
3F:→ reizarc:在碰到这个 case 之前我一直是这麽认为的 Orz 03/11 16:27
4F:→ reizarc:刚刚又试了一下 奇怪的是印出 \@a 的值 03/11 16:34
5F:→ reizarc:在写 @a = @c; 前後, \@a 的值依然是相同的耶 :o 03/11 16:35
6F:→ reizarc:还是说 \@a, \$a[i] 其实并没有绝对的关联 03/11 16:36
7F:→ reizarc:属於 @a 的 $a[i] 的位置在内部其实是会变动的 03/11 16:38