1

私は次のようなPerlコードを持っています:

$pre = $dbh->prepare("select distinct skills from people");
$pre->execute;

my @preList;
while (my $row = $pre->fetchrow_array()) {
    push (@preList,$row);
}
print "Pre list: $_" foreach @preList;

SQLでまったく同じステートメントを試すと完全に機能しますが、このプログラムを実行すると何も出力されません(空のことを示唆しています@preList)。私はおそらく非常に愚かなことをしていますが、それを見ることはできません。以前にデータを取得するためにこの形式を使用したことがありますが、これは完全に機能します。誰かが私が間違ったことを見ることができますか?

4

4 に答える 4

7

これはリストを返しますが、fetchrow_arrayそれをスカラーに格納しようとしています。それを に変更するか、 に変更するか、 に変更するfetchrow_arrayrefこと$row@rowできmy $rowますmy ($row)

于 2012-10-11T14:00:45.610 に答える
4

あなたが言う時:

while (my $row = $pre->fetchrow_array()) {

値が行から返され、$ rowに割り当てられてから、真偽がテストされます。falseのスキル値が返されるとすぐに、その値を@preListに入れずに、ループが終了します。結果の最初の行にNULL、「」、または「0」のスキルがある場合、表示されている結果が表示されます。

に変更:

while (my ($row) = $pre->fetchrow_array()) {

(または他の人が示唆しているように@rowを使用して)、値は引き続き各行から返され、$ rowに割り当てられますが、値が真であるかどうかがテストされる代わりに、fetchrow_arrayから返される要素の数が真であるかどうかがテストされます(およびfetchrow_arrayは、結果の行がなくなると空のリストを返すため、この数値は結果の各行に対して1であり、ループを終了する場合は0です)。これは、while()がスカラーのテストを期待しているため、割り当てにスカラーコンテキストを与え、perlでは、スカラーコンテキストのリスト割り当てが、割り当ての右側にある要素の数を返すために発生します。具体的には、このようなコードは次のようになります。ただ働く。

于 2012-10-11T16:42:06.560 に答える
2
$pre = $dbh->prepare("select distinct skills from people");
$pre->execute;

my @preList;
while (my $row = $pre->fetch()) {
    push (@preList,$row);
}
foreach @preList{
    print "Pre list row: " . join(',',@$_);
}

また:

$pre = $dbh->prepare("select distinct skills from people");
$pre->execute;

my $preList = $pre->fetchall_arrayref();

foreach @$preList{
    print "Pre list row: " . join(',',@$_);
}
于 2012-10-11T14:25:42.773 に答える
0

fetchrow_arrayコードを に置き換えてみてくださいfetchrow_arrayref

于 2012-10-11T13:59:18.843 に答える