Perl 为什么我的值在不重置时发生变化?
下面的例子展示了我正在努力解决的问题。 在玩具示例中,我有一个具有两个级别的数组Perl 为什么我的值在不重置时发生变化?,perl,reference,Perl,Reference,下面的例子展示了我正在努力解决的问题。 在玩具示例中,我有一个具有两个级别的数组@actors。 我还有一个哈希数组@people,我正在使用它来“查找”@actors中人员的属性 程序的输出应为: blue, blue cat, cat red, red dog, dog blue, blue cat, cat red, red dog, dog 但我得到的是: blue, cat cat, cat red, dog dog, dog blue
@actors
。
我还有一个哈希数组@people
,我正在使用它来“查找”@actors
中人员的属性
程序的输出应为:
blue, blue cat, cat
red, red dog, dog
blue, blue cat, cat
red, red dog, dog
但我得到的是:
blue, cat cat, cat
red, dog dog, dog
blue, cat cat, cat
red, dog dog, dog
也就是说,在设置$favanim[$i][$j]
时,我似乎也在覆盖$favcols[$i][$j]
的值。
我怀疑由于某种原因,@actors
是一个二维数组,这意味着通过=
的赋值是作为引用而不是作为值,尽管我不知道为什么或者如何停止它。
请帮忙
玩具程序在这里:(我很抱歉,如果它可以简化,同时仍然显示出问题-它已经花了我一下午的大部分时间来剥离到这个问题)
#/usr/bin/perl-w
我的@people=();
$people[0]{'regexp'的备选全名}='matthew smith | matt smith';
$people[1]{'regexp的备选全名'}='david tennant | dave tennant';
$people[0]{'fav color}='red';
$people[1]{'fav color}='blue';
$people[0]{'fav animal'}='dog';
$people[1]{'fav animal'}='cat';
我的@actors=();
$actors[0][0]=“David Tennant”;
$actors[0][1]=“马特·史密斯”;
$actors[1][0]=“David Tennant”;
$actors[1][1]=“马特·史密斯”;
我的@favcols=@演员;
我的@favanim=@演员;
对于($i=0;$i请尝试使用
@favcols = map { [@$_] } @actors;
@favanim = map { [@$_] } @actors;
深拷贝与浅拷贝。尝试使用
@favcols = map { [@$_] } @actors;
@favanim = map { [@$_] } @actors;
深拷贝与浅拷贝。尝试使用
@favcols = map { [@$_] } @actors;
@favanim = map { [@$_] } @actors;
深拷贝与浅拷贝。尝试使用
@favcols = map { [@$_] } @actors;
@favanim = map { [@$_] } @actors;
深度复制与浅层复制。问题在于,通过复制包含两个数组引用的@people
的内容,您正在初始化@favcols
和@favanim
这将$favcol[0]
和$favanim[0]
设置为对同一数组的引用,['David Tennant','Matt Smith']
,因此当您修改$favcols[$i][$j]
然后修改$favanim[$i][$j]
时,您将覆盖同一数组元素
我看不出有任何理由初始化数组,如果您将它们声明为
my (@favcols, @favanim);
然后你会发现你的程序实现了你的期望
顺便说一句,您必须始终使用strict
,并且使用warnings
比命令行上的-w
更可取问题是,您通过复制@people
的内容来初始化@favcols
和@favanim
,其中包含两个数组引用
这将$favcol[0]
和$favanim[0]
设置为对同一数组的引用,['David Tennant','Matt Smith']
,因此当您修改$favcols[$i][$j]
然后修改$favanim[$i][$j]
时,您将覆盖同一数组元素
我看不出有任何理由初始化数组,如果您将它们声明为
my (@favcols, @favanim);
然后你会发现你的程序实现了你的期望
顺便说一句,您必须始终使用strict
,并且使用warnings
比命令行上的-w
更可取问题是,您通过复制@people
的内容来初始化@favcols
和@favanim
,其中包含两个数组引用
这将$favcol[0]
和$favanim[0]
设置为对同一数组的引用,['David Tennant','Matt Smith']
,因此当您修改$favcols[$i][$j]
然后修改$favanim[$i][$j]
时,您将覆盖同一数组元素
我看不出有任何理由初始化数组,如果您将它们声明为
my (@favcols, @favanim);
然后你会发现你的程序实现了你的期望
顺便说一句,您必须始终使用strict
,并且使用warnings
比命令行上的-w
更可取问题是,您通过复制@people
的内容来初始化@favcols
和@favanim
,其中包含两个数组引用
这将$favcol[0]
和$favanim[0]
设置为对同一数组的引用,['David Tennant','Matt Smith']
,因此当您修改$favcols[$i][$j]
然后修改$favanim[$i][$j]
时,您将覆盖同一数组元素
我看不出有任何理由初始化数组,如果您将它们声明为
my (@favcols, @favanim);
然后你会发现你的程序实现了你的期望
顺便说一下,您必须始终使用strict
,并且使用warnings
比命令行上的-w
更可取-w
,谢谢!如果@actors
是一个三维数组,我如何修改它才能工作?实际上,现在我知道要搜索什么了,这些问题很有帮助!谢谢!我怎么能修改它使其在@actors
是三维数组的情况下工作?事实上,现在我知道要搜索什么了,这些问题很有用!谢谢!这很有效!我如何修改它使其在@actors
是三维数组的情况下工作?事实上,现在我知道要搜索什么了,这些问题很有用!谢谢!我怎么能n如果@actors
是一个三维数组,我会修改它以使其工作?实际上,现在我知道要搜索什么了,这些问题很有帮助!@JackB:既然您正在覆盖数据,为什么还要复制@actors
数组?非常感谢您的解释和关于在没有I的情况下声明变量的提示初始化它们。在我的实际脚本(不是上面的玩具示例)中,我没有覆盖所有的值。但我现在找到了一种解决方法。所以你的答案对我来说是最好的,尽管Raghuveer回答了我实际问到的问题,所以我会接受这个问题。(我会向上箭头,但显然我没有eno。)