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

no1*_*no1 1 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";
}
Run Code Online (Sandbox Code Playgroud)

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

TLP*_*TLP 6

你在这里使用一个赤字:

$y[k]=$current;
#  ^--- here, the "k" is a bareword
Run Code Online (Sandbox Code Playgroud)

如果你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.
Run Code Online (Sandbox Code Playgroud)

并且"k"将被解释为一个字符串,将被转换为一个数字,它将为零0,因此所有数据都存储在其中$y[0].

这就是为什么不打开警告是一个非常糟糕的主意.

你可能想要的是将新值推送到数组:

push @y, $current;
Run Code Online (Sandbox Code Playgroud)

这是IMO,比使用索引更可取,因为它可以帮助您.通常,如果索引本身对您有价值,例如比较数组元素时,您只希望专门涉及数组索引.

这也意味着你的后续for循环

for ($k=0;$k<$N;$k++) {
  print "$y[k]\t";
}
Run Code Online (Sandbox Code Playgroud)

写的更好

for (@y) {
    print "$_\t";
}
Run Code Online (Sandbox Code Playgroud)

虽然这写得更好join:

print join "\t", @y;
Run Code Online (Sandbox Code Playgroud)

作为最后一点,你应该总是使用

use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)

使用这些编译指示时需要花费少量的学习来克服额外的噪音,但在学习和减少调试时间方面它是值得的.我通常说不使用这些pragma就像掩盖你车里的低油警告灯:不知道错误并没有解决它们.