-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. 尝试use Data::Dumper; print Dumper($result);在 while 循环的第一行添加以查看您读入的数据。
  • 我不确定您使用的是什么格式/usr/address,但如果它有不止一行,那么您只是从该文件中读取第一行。您可以通过$/首先进行本地化来一次性读取整个文件(请参阅perldoc perlvar)。此外(正如 Ivan 所说),这个字符串的末尾仍然会有一个换行符:使用chomp它来剥离它(也许在分成几行之后,如果你 slurped 不止一个)。请参阅perldoc -f chompperldoc -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 回答