1

一旦我离开for循环,我的多维数组哈希中的一些变量就会消失。变量在循环中一个接一个地正确打印,但是当我在循环之外打印任何项目时,除了第一个项目外,它始终为空。

for my $y (0..$last_row - 2) {
    my $mlid = $Sheet->Cells($y+2, 1)->{'Value'}; 
    my @a = ();
    $a[0] = $Sheet->Cells($y+2, 3)->{'Value'}; 
    $a[1] = $Sheet->Cells($y+2, 4)->{'Value'}; 
    $a[2] = $Sheet->Cells($y+2, 6)->{'Value'}; 
    $a[3] = $Sheet->Cells($y+2, 7)->{'Value'}; 
    $a[4] = $Sheet->Cells($y+2, 8)->{'Value'}; 
    push @{$longHash{$mlid}}, [ @a ];
    print "Item in Array in Hash: $longHash{$mlid}[1][0]\n"; #this prints nothing

    if (exists $numPeople{$mlid}){
        $numPeople{$mlid}++;
    }else{
        $numPeople{$mlid} = 0;
        $numPeople{$mlid}++;
    }
}

print "Item in Array in Hash: $longHash{7202}[0][0]\n"; #this prints properly
print "Item in Array in Hash: $longHash{7202}[1][0]\n"; #this prints nothing

行为应该是:

我有一个哈希。单个 mlid 的键给出了一个数组(代表一个人)。在每个数组中,应该有另一个数组,其中 0-4 索引是从我正在阅读的 Excel 文件中定义的。

因此,要从 mlid 7202、第 7 个人和 Excel 中的第 4 列获取数据,我应该输入 $longHash{7202}[7][1](因为我将第 4 列映射到大批。)

4

2 回答 2

4

$longHash{$mlid}在循环的每次迭代中都会覆盖,因此在最好的情况下$longHash{7202}[$x],只会为$x.

除非你做的事情比你在这里展示的要复杂得多,否则我认为你根本不需要清除$longHash{$mlid}。说

$longHash{key}[index] = expression

将自动激活$longHash{key}$longhash{key}[index]无需任何预初始化。

$longHash{$mlid} = ()看起来也有点奇怪——您将一个空列表分配给一个标量变量。我认为这与说 . 没有什么不同$longHash{$mlid}=0。如果您打算将其设置为一个空数组引用,那么您应该使用[]而不是())。

于 2011-02-22T20:23:43.470 回答
2

我看到两个问题。

  1. $longHash{$mlid} = ()

您正在尝试将标量字段设置为列表。{$mlid}` 应设置为列表ref,而不是列表。最简单的解决方法是$longHash{$mlid} = [],但这并不能解决真正的问题。

2. $longHash{$mlid}[$y] = [ @a ];结合$longHash{$mlid} = ();

您正在$longHash{$mlid}通过循环清除每次传递,然后尝试分配给非零索引。也许你在这里想要的是散列的散列而不是列表的散列。

更新

在你的新版本中,我认为

push @{$longHash{$mlid}}, [ @a ];

应该只是

$longHash{$mlid} = [ @a ];

更新 2

我认为您的代码现在应该可以工作了。

它似乎等同于我下面的简化示例:

my %hash;

my @a;
$a[0] = "Fred";
$a[1] = 31;
$a[2] = "Melbourne";

push @{$hash{7202}}, [ @a ];

$a[0] = "Mary";
$a[1] = 25;
$a[2] = "Sydney";

push @{$hash{7202}}, [ @a ];

print $hash{7202}[0][0] . "\n";
print $hash{7202}[1][0] . "\n";

更新 3

请加

use warnings;
use strict;

确保您认为存在的所有数组索引确实存在。

并尝试遍历您的数据以打印它,例如

for my $mlid (keys %hash) {
    my $recordref = $hash{$mlid};
    my @record = @$recordref;
    for my $i (0..scalar(@record)-1) {
        printf "mlid %s person %d name %s\n", $mlid, $i, $record[$i][0];
    }
}
于 2011-02-22T20:25:29.630 回答