perl – 数组元素自动设置为undef在别名时不会改变?
发布时间:2020-12-15 21:18:10 所属栏目:大数据 来源:网络整理
导读:关于 this问题,手动设置有什么区别? 到undef列表元素和由Perl设置的增长的大小 该列表通过分配到比列表大小更大的索引 走样?例如,考虑这个代码: @a = (undef,0);@b = ();$b[1] = 0;print Dumper(@a),"n",Dumper(@b); 它打印(如预期,我想): $VAR1 = u
关于
this问题,手动设置有什么区别?
到undef列表元素和由Perl设置的增长的大小 该列表通过分配到比列表大小更大的索引 走样?例如,考虑这个代码: @a = (undef,0); @b = (); $b[1] = 0; print Dumper(@a),"n",Dumper(@b); 它打印(如预期,我想): $VAR1 = undef; $VAR2 = 0; $VAR1 = undef; $VAR2 = 0; 那么,数组不是一样的吗?显然不是: sub change { $_[0] = 1 } change(@a); change(@b); print Dumper(@a),Dumper(@b); 哪个打印: $VAR1 = 1; $VAR2 = 0; $VAR1 = undef; $VAR2 = 0; 解决方法
你发现了一个迷人的边缘情况。
当你明确设置一个元素时,它首先出现。如果扩展了一个数组,使得多个索引落入该数组的范围内,则不会在这些位置隐式地初始化标量。例: my @array; $array[2] = undef; # this extends the array # now elements 0–2 report as `undef`,but only #2 was initalized 当我们询问这些元素是否存在时,我们得到: say "index $_ ",exists $array[$_] ? "exists" : "doesn't exist" for 0 .. 4; 输出: index 0 doesn't exist index 1 doesn't exist index 2 exists index 3 doesn't exist index 4 doesn't exist 此优化可以节省您在这些位置分配未使用的标量;数组访问代码只返回一个undef,当没有任何东西说明否则。 现在这个函数调用很方便。当一个子程序被调用时,一个平面的标量列表放在堆栈上,然后以@_方式访问。这里没有复制,所以这是别名的调用。现在当你的子文件中访问$ _ [0]元素时,这里没有标量,所以在@_中创建一个新的元素: sub crazy { say 1*exists $_[0]; $_[0] = 1; say 1*exists $_[0]; } my @array; $array[2] = 0; crazy @array; say 1*exists $array[0]; 输出: 0 1 0 在内部,标量是指向SV结构体的指针。这些指针被复制到堆栈上,所以这使得原来的@array的实际修改是不可能的。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |