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。)