【问题标题】:Why does my value change when I am not resetting it?为什么我的值在我不重置时会发生变化?
【发布时间】:2015-06-18 17:55:45
【问题描述】:

以下示例展示了我正在努力解决的问题。 在玩具示例中,我有一个包含两个级别的数组 @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";
  }
}

【问题讨论】:

    标签: perl reference


    【解决方案1】:

    尝试使用

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

    深拷贝与浅拷贝。

    【讨论】:

    【解决方案2】:

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

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

    我看不出有任何理由初始化你的数组,如果你声明它们只是

    my (@favcols, @favanim);
    

    然后你会发现你的程序做你所期望的

    顺便说一句,您必须始终use strict,并且use warnings 在命令行上比-w 更可取

    【讨论】:

    • @JackB:既然要覆盖数据,为什么还要复制@actors 数组?
    • 非常感谢您的解释和关于在不初始化变量的情况下声明变量的提示。在我的实际脚本(不是上面的玩具示例)中,我没有覆盖所有值。但我现在找到了解决这个问题的方法。所以你的回答对我来说是最好的,尽管 Raghuveer 回答了我实际提出的问题,所以我会接受那个问题。 (我会向上箭头,但显然我没有足够的声誉!)
    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    相关资源
    最近更新 更多