Perl   发布时间:2022-04-07  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了perl – 数组元素自动设置为undef在别名时不会改变?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
关于 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;

解决方法

发现了一个迷人的边缘情况。

当你明确设置一个元素时,它首先出现。如果扩展了一个数组,使得多个索引落入该数组的范围内,则不会在这些位置隐式地初始化标量。例:

@H_473_5@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的实际修改是不可能的

大佬总结

以上是大佬教程为你收集整理的perl – 数组元素自动设置为undef在别名时不会改变?全部内容,希望文章能够帮你解决perl – 数组元素自动设置为undef在别名时不会改变?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。