我正在尝试从数据库访问数据并将数据复制到数组中。这是我的代码,
$sth = $dbh->prepare("SELECT * FROM abcd WHERE id=100 ");
$sth->execute;
$N=$sth->rows;
print "$N\n";
while (my @row_val = $sth->fetchrow_array()){
my ($uniqid, $time, $current, $id ) = @row_val;
$y[k]=$current;
$k++;
}
for ($k=0;$k<$N;$k++) {
print "$y[k]\t";
}
但它显示所有$ y [k]的相同值。如何将数据从数据库复制到perl中的数组?
答案 0 :(得分:6)
您在这里使用的是:
$y[k]=$current;
# ^--- here, the "k" is a bareword
如果你use warnings
这会发出警告
Unquoted string "k" may clash with future reserved word at foo.pl line 10.
Argument "k" isn't numeric in array element at foo.pl line 10.
“k”将被解释为一个字符串,将被转换为一个数字,该数字将为零0
,因此您的所有数据都存储在$y[0]
中。
这就是为什么不打开警告是一个非常糟糕的主意。
您可能想要的是将新值推送到数组上:
push @y, $current;
这是IMO,比使用索引更好,因为它可以帮助您。通常,如果索引本身对您有价值,例如比较数组元素时,您只想专门涉及数组索引。
这也意味着你的后续for循环
for ($k=0;$k<$N;$k++) {
print "$y[k]\t";
}
写得更好
for (@y) {
print "$_\t";
}
尽管使用join
更好地编写了
print join "\t", @y;
作为最后一点,你应该总是使用
use strict;
use warnings;
在使用这些pragma时,需要花费少量的学习来克服额外的噪音,但在学习和减少调试时间方面它是值得的。我经常说不使用这些pragma就像掩盖你车里的低油警告灯:不知道错误并不能解决它们。
答案 1 :(得分:3)
这种行为是因为你把所有东西都写成索引“k” - 不是任何数字只是“k”, 它只是一个巧合,它的工作在所有:) - “相同的价值”是最后一个值 - 不是吗? :)
<强> SOLUTION:强>
1)变量是用$写的 - 在访问$yourArray[$variableWithIndex]
2)$y[k]=$current;
#错了!您正在尝试访问“k”索引
正确:$y[$k]=$current;
Didnt测试了它 - 但这应该有效:
$sth = $dbh->prepare("SELECT * FROM abcd WHERE id=100 ");
$sth->execute;
$N=$sth->rows;
print "$N\n";
$k=0; # init first!
while (my @row_val = $sth->fetchrow_array()){
my ($uniqid, $time, $current, $id ) = @row_val;
$y[$k]=$current; # dont forget the $
$k++;
}
for ($k=0;$k<$N;$k++) {
print "$y[$k]\t"; # dont forget the $
}