当我没有重置时,为什么我的价值会改变?

时间:2015-06-18 17:55:45

标签: 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, cat     cat, cat
red, dog     dog, dog

也就是说,似乎在设置$favanim[$i][$j]时,我似乎也在覆盖$favcols[$i][$j]的值。 我怀疑由于某种原因,@actors是一个二维数组的事实意味着通过=的作业是作为参考而不是作为值,但我不知道为什么或如何停止它。 请帮忙!

玩具程序在这里:(如果可以简化,同时仍然表现出问题,我很抱歉 - 下午我大部分时间都把它剥离了)

#!/usr/bin/perl -w

my @people = ();
$people[0]{'alternative full names for regexp'} = 'matthew smith|matt smith';
$people[1]{'alternative full names for regexp'} = 'david tennant|dave tennant';
$people[0]{'fav colour'} = 'red';
$people[1]{'fav colour'} = 'blue';
$people[0]{'fav animal'} = 'dog';
$people[1]{'fav animal'} = 'cat';

my @actors = ();
$actors[0][0] = 'David Tennant';
$actors[0][1] = 'Matt Smith';
$actors[1][0] = 'David Tennant';
$actors[1][1] = 'Matt Smith';
my @favcols = @actors;
my @favanim = @actors;

for ($i=0; $i<2; $i++) {
  for ($j=0; $j<2; $j++) {
    my @matching_people = grep{$actors[$i][$j] =~ m/^$_->{'alternative full names for regexp'}$/i} @people;
    $favcols[$i][$j] = $matching_people[0]{'fav colour'};
    $favanim[$i][$j] = $matching_people[0]{'fav animal'};
    print "$matching_people[0]{'fav colour'}, $favcols[$i][$j]     $matching_people[0]{'fav animal'}, $favanim[$i][$j]\n";
  }
}

2 个答案:

答案 0 :(得分:2)

尝试使用

@favcols = map { [@$_] } @actors;
@favanim = map { [@$_] } @actors;

深拷贝与浅拷贝。

答案 1 :(得分:1)

问题在于您通过复制@favcols的内容来初始化@favanim@people,其中包含两个数组引用

这会将$favcol[0]$favanim[0]设置为对相同数组[ 'David Tennant', 'Matt Smith' ]的引用,因此当您修改$favcols[$i][$j]然后{{ 1}}你正在覆盖相同的数组元素

我认为根本没有任何理由初始化你的数组,如果你将它们声明为

$favanim[$i][$j]

然后你会发现你的程序符合你的期望

顺便说一句,必须始终 my (@favcols, @favanim); ,而use strict优先于命令行上的use warnings