Che*_*eso 0 arrays perl push copy reference
问题: 为什么我不能将元素推入一个2d数组,该数组位于解析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";
Run Code Online (Sandbox Code Playgroud)
输出是:
-------------------------
[0][0]:0
[0][1]:1
[0][2]:2
[0][3]:3
[1][0]:4
[1][1]:5
[1][2]:6
[1][3]:7
Run Code Online (Sandbox Code Playgroud)
我正在运行一些SQL来构建一个X包含列数的结果集.为了将数据存储到我的数组中,我想我可以使用与上面相同的语法:
while (@results=$sth->fetchrow_array())
{
push(@stu_pool,\@results);
}
Run Code Online (Sandbox Code Playgroud)
我测试了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++;
Run Code Online (Sandbox Code Playgroud)
那么是什么阻止我将元素推入这个数组呢?它适用于第一个示例,但是当我尝试打印出元素时,它们都是空白的.我正在使用的代码:
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";
Run Code Online (Sandbox Code Playgroud)
重复:
为什么push方法在while循环中无效?
让我稍微改变你的第一个例子.
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";
Run Code Online (Sandbox Code Playgroud)
输出:
[0][0]:4
[0][1]:5
[0][2]:6
[0][3]:7
[1][0]:4
[1][1]:5
[1][2]:6
[1][3]:7
Run Code Online (Sandbox Code Playgroud)
你没有复制@tt到@t.您将变量的引用@tt放入@t.因此,当其他事情发生时@tt,它也会在获取时发生变化@t.要真正复制,您想要push(@t,[@tt])或者@{$t[$i]} = @tt是否$i是适当的索引变量.
或者对于另一个例子,试试吧 push(@stu_pool, [@results]);
只有一个@results- 您将@stu_pool引用的每个元素都设置为相同@results,这将(最后一次检查循环条件)最终将被设置为包含().
你想要的是添加my:while (my @results = $sth->fetchrow_array) {工作得很好,因为现在每次循环@results都是一个不同的数组.