如何将数据复制到perl中的数组?

时间:2013-10-09 10:08:26

标签: 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]=$current;
  $k++;
}
for ($k=0;$k<$N;$k++) {
  print "$y[k]\t";
}

但它显示所有$ y [k]的相同值。如何将数据从数据库复制到perl中的数组?

2 个答案:

答案 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 $
}