Database 如何在perl中将数据复制到数组?
我正在尝试从数据库访问数据,并将数据复制到数组中。这是我的密码Database 如何在perl中将数据复制到数组?,database,perl,Database,Perl,我正在尝试从数据库访问数据,并将数据复制到数组中。这是我的密码 $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
$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中将数据从数据库复制到数组?您在这里使用的是裸体字:
$y[k]=$current;
# ^--- here, the "k" is a bareword
如果使用警告,则会发出警告
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;
在我看来,这比使用索引更可取,因为它可以为您完成所有工作。通常,只有在索引本身对您有价值的情况下(例如在比较数组元素时),您才希望特别涉及数组索引
这也意味着您的后续for循环
for ($k=0;$k<$N;$k++) {
print "$y[k]\t";
}
尽管使用join编写此命令更好:
最后,您应该始终使用
use strict;
use warnings;
在使用这些pragma时,需要少量的学习来克服额外的噪声,但是从学习和减少调试时间的角度来看,这是非常值得的。我通常会说,不使用这些pragmas就像掩盖车内的低油警告灯:不知道错误并不能解决问题。您在这里使用的是一个空话:
$y[k]=$current;
# ^--- here, the "k" is a bareword
如果使用警告,则会发出警告
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;
在我看来,这比使用索引更可取,因为它可以为您完成所有工作。通常,只有在索引本身对您有价值的情况下(例如在比较数组元素时),您才希望特别涉及数组索引
这也意味着您的后续for循环
for ($k=0;$k<$N;$k++) {
print "$y[k]\t";
}
尽管使用join编写此命令更好:
最后,您应该始终使用
use strict;
use warnings;
在使用这些pragma时,需要少量的学习来克服额外的噪声,但是从学习和减少调试时间的角度来看,这是非常值得的。我通常会说,不使用这些pragmas就像是掩盖了车上的低油警告灯:不知道错误并不能解决问题。这种行为是因为你把所有的东西都放在索引k中,而不是任何数字,只是k, 这只是一个巧合,它的工作在所有:-相同的值是最后一个值-不是吗?: 解决方案: 1变量是用$编写的-访问$yourArray[$variableWithIndex]时请记住这一点 2$y[k]=$current;错误的您正在尝试访问k索引 正确:$y[$k]=$current 没有测试它-但这应该可以工作:
$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 $
}
这种行为是因为你把所有的东西都放在索引k中——不是任何数字,只是k, 这只是一个巧合,它的工作在所有:-相同的值是最后一个值-不是吗?: 解决方案: 1变量是用$编写的-访问$yourArray[$variableWithIndex]时请记住这一点 2$y[k]=$current;错误的您正在尝试访问k索引 正确:$y[$k]=$current 没有测试它-但这应该可以工作:
$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 $
}
$y[k]显然是一个语法错误。在发布问题之前,请确保您的代码正常工作,否则很难诊断。@RichardHuxton代码对我有效,没有任何错误。我知道我的代码错了!所以我想得到你们的帮助@RichardHuxton这不是语法错误,这是一个赤裸裸的错误。语法是有效的,在没有打开警告的情况下,错误是无声的。@TLP-嗯,这是一个语法错误。Poster想使用标量变量$k,但语法错误。赤裸裸的警告是因为Perl不能像你我一样确定意图。@RichardHuxton是的,我只是指出它正在运行代码,所以OP没有做错什么。最大的错误是没有使用警告,依我看,$y[k]显然是一个语法错误。在发布问题之前,请确保您的代码正常工作,否则很难诊断。@RichardHuxton代码对我有效,没有任何错误。我知道我的代码错了!所以我想得到你们的帮助@RichardHuxton这不是语法错误,这是一个赤裸裸的错误。语法是有效的,在没有打开警告的情况下,错误是无声的。@TLP-嗯,这是一个语法错误。Poster想使用标量变量$k,但语法错误。赤裸裸的警告是因为Perl不能像你我一样确定意图。@RichardHuxton是的,我只是指出它正在运行代码,所以OP没有做错什么。IMO称,最大的错误是没有使用警告。