-1

column に対応する行を引き出す必要がありますname。引き出される行は、配列内のアドレスに対応します@values。以下は私のコードです:

use strict;
use DBI;

open (FH, "/user/address") or die $!;
my@values=<FH>;
close(FH);
my @names;

my $query = "Select name from table where address = ?";
my $sth = $dbh->prepare( $query ) or die "could not prepare statement\n", $dbh->errstr;
foreach my $value(@values){ #@values contain list of address
        $sth->execute($value) or die "could not execute statement $query\n", $sth->errstr;
        while ($result = $sth->fetchrow_hashref()){
               my $name_reqd = $result->{name};
               print "Name Req: $name_reqd\n"; #not printing anything 
               push (@names, $name_reqd);
        }
}
print "@names\n"; #not printing anything

しかし、印刷@namesすると出力が得られず、何が問題なのかわかりません。

4

6 に答える 6

4

私はいくつかのことを見ます:

  • 使用する前に宣言していません@names。つまり、最初の使用のスコープで自動的に宣言されています。while ループ内です。さらに、ループの反復ごとに新しいコピーが破棄されて作成され、 を呼び出すと新しい (空の) コピーが作成されますprint。追加するuse warnings;とこれがキャッチされます。
  • (mobrule や他の人が言ったように) からデータに正しくアクセスしていない可能性があります$result。while ループの先頭行に追加use Data::Dumper; print Dumper($result);して、読み込んだデータを確認してください。
  • で使用している形式はわかりませんが/usr/address、複数行ある場合は、そのファイルから最初の行だけを読み取っています。$/最初にローカライズすることで、ファイル全体を一度に読み込むことができます( perldoc perlvarを参照)。さらに(Ivanが言ったように)、この文字列にはまだ改行が最後にあります:chompそれを取り除くために使用します(複数の行に分割した後、おそらく複数の行を丸呑みした場合)。perldoc -f chompおよびperldoc -f splitを参照してください。

これらのポイントの間に、どこで問題が発生したかを簡単に確認できるように、十分なデバッグ データが出力されているはずです。

于 2009-11-20T18:09:57.687 に答える
3

このコードの問題は、ファイルの読み取りです。コードは、末尾にmy @values=<FH>;改行 ( ) 記号があるすべての行を読み取ります。\nこの場合、手動で削除する必要があります。関数を使用してそれを行うことができますchomp

open (FH, "/user/address") or die $!;
my @values = <FH>;
chomp(@values);
close(FH);

更新: 見つからないだけなので、何も検索していないと思います。通常、アドレスにはスペースが含まれています。クエリSelect name from table where address = ?は、完全に等しいアドレスのみを検索します (大文字と小文字のみが無視されます)。たとえば、"a" は sql の "a" と等しくありません。

于 2009-11-20T17:52:42.167 に答える
2

テストされていませんが、このようにフィールドにアクセスしないでください。

my $name_reqd = $result[0];

これは、fetchrow_array() を使用しているためです。

于 2009-11-20T17:37:39.107 に答える
2

データベース ドライバが列名を小文字で返すことを確認する必要があります。また、selectcol_arrayref次のタイプのクエリにも使用します。

use strict;
use warnings;

use DBI;
use File::Slurp;

my @values = read_file '/user/address';
chomp @values;

my $dbh = DBI->connect(
    # appropriate parameters
);

my $sth = $dbh->prepare(
    'SELECT name FROM table WHERE address = ?'
) or die sprintf 'Cannot prepare: %s', $dbh->errstr;

my @names;

for my $value ( @values ) {
    my $names = $dbh->selectcol_arrayref(
        $sth,  {},  $value
    ) or die sprintf 'Cannot select col: %s',  $dbh->errstr;

    push @names,  @$names;
    print "'$_'\n" for @$names;
);

print "@names\n";
于 2009-11-20T17:40:00.830 に答える
1

DBI は列名の大文字と小文字を変換するため、"name" ではなく "NAME" キーで結果を返す場合があります。

print keys %$resultに電話した後、何が表示されます$sth->fetchrow_hashrefか?

于 2009-11-20T17:56:14.313 に答える
0

あなたのテーブルは本当に「テーブル」と呼ばれていますか? たぶん、テーブルの実際の名前に設定されて$tableいるはずです。$table

たとえば、SQLite や MySQL にこれがある場合は、データベース コマンド ラインからクエリを実行してみてください。

于 2009-11-20T17:36:40.467 に答える