Perl - 使用变量引用与使用变量副本推入数组

时间:2010-10-10 19:46:04

标签: arrays perl reference copy push

问题:为什么我不能将元素推送到一个解析SQL结果集的while循环内部的二维数组?

我需要一些帮助,为什么会发生这种情况。数据存储到二维数组的方式可以通过多种方式完成,但就我的目的而言,我需要使用push方法。

以下是一些有用的代码:

my @tt = (0,1,2,3);
my @t;
push (@t,\@tt);
print "[0][0]:".$t[0][0]."\n";
print "[0][1]:".$t[0][1]."\n";
print "[0][2]:".$t[0][2]."\n";
print "[0][3]:".$t[0][3]."\n";
@tt = (4,5,6,7);
push (@t,\@tt);
print "[1][0]:".$t[1][0]."\n";
print "[1][1]:".$t[1][1]."\n";
print "[1][2]:".$t[1][2]."\n";
print "[1][3]:".$t[1][3]."\n";

输出结果为:

-------------------------
[0][0]:0
[0][1]:1
[0][2]:2
[0][3]:3
[1][0]:4
[1][1]:5
[1][2]:6
[1][3]:7

<小时/> 这是我遇到的问题

我正在运行一些SQL来构建一个列数为X的结果集。为了将数据存储到我的数组中,我想我可以使用与上面相同的语法:

while (@results=$sth->fetchrow_array())
{
    push(@stu_pool,\@results);
} 

我测试了SQL并检查了结果集,因此问题与此无关。我还回到了长期的方法,这让我得到了我期望的最终结果。而不是使用push(@stu_pool,\@results);我在循环中使用了这段代码:

$stu_pool[$index][0] = $results[0];
$stu_pool[$index][1] = $results[1];
$stu_pool[$index][2] = $results[2];
$stu_pool[$index][3] = $results[3];
$stu_pool[$index][4] = $results[4];
$stu_pool[$index][5] = $results[5];
$stu_pool[$index][6] = $results[6];
$index++;

那么是什么阻止我将元素推入这个数组?它适用于第一个示例,但是当我尝试打印出元素时,它们都是空白的。我正在使用的代码:

print "[0][0]:".$stu_pool[0][0]."\n";
print "[0][1]:".$stu_pool[0][1]."\n";
print "[0][2]:".$stu_pool[0][2]."\n";
print "[0][3]:".$stu_pool[0][3]."\n";
print "[1][0]:".$stu_pool[1][0]."\n";
print "[1][1]:".$stu_pool[1][1]."\n";
print "[1][2]:".$stu_pool[1][2]."\n";
print "[1][3]:".$stu_pool[1][3]."\n";

重复:

为什么push方法在while循环中无效?

3 个答案:

答案 0 :(得分:9)

让我稍微改变你的第一个例子。

my @tt = (0,1,2,3);
my @t;
push (@t,\@tt);
@tt = (4,5,6,7);
push (@t,\@tt);
print "[0][0]:".$t[0][0]."\n";
print "[0][1]:".$t[0][1]."\n";
print "[0][2]:".$t[0][2]."\n";
print "[0][3]:".$t[0][3]."\n";
print "[1][0]:".$t[1][0]."\n";
print "[1][1]:".$t[1][1]."\n";
print "[1][2]:".$t[1][2]."\n";
print "[1][3]:".$t[1][3]."\n";

输出:

[0][0]:4
[0][1]:5
[0][2]:6
[0][3]:7
[1][0]:4
[1][1]:5
[1][2]:6
[1][3]:7

您没有将@tt复制到@t。您将变量@tt的引用放入@t。因此,当@tt发生其他问题时,它也会在通过@t获取时发生变化。要真正制作副本,如果push(@t,[@tt])是适当的索引变量,则需要@{$t[$i]} = @tt$i

或者对于其他示例,请尝试push(@stu_pool, [@results]);

答案 1 :(得分:5)

只有一个@results - 您正在使@stu_pool的每个元素都引用相同的@results,这最后一次检查循环条件时最终会设置为包含()

你想要的是添加mywhile (my @results = $sth->fetchrow_array) {可以正常使用,因为现在每次循环时,@results都是不同的数组。

答案 2 :(得分:1)

为什么要循环?它更容易做到:

my $results = $sth->fetchall_arrayref();

或者如果你坚持使用数组变量:

my @results = @{$sth->fetchall_arrayref()};