Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何在perl中将数据复制到数组?_Database_Perl - Fatal编程技术网

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称,最大的错误是没有使用警告。