3

我正在做一些练习来提高我的 Perl 技能,其中一个涉及连接到 SQL 数据库、运行查询以及将结果作为数组返回。这是我到目前为止所拥有的:

my $search = $_[0];
our $dbh = DBI->connect{"dbi:mysql:dbname=database", "root", "password")
    or die $DBI::errstr;
my $sql = $dbh->selectall_arrayref("SELECT Player from Players_Sport where Sport like '$search'")
    or die $DBI::errstr;
my @array = map { $_->[0] } @$sql;
$dbh->disconnect
    or warn "Disconnection failed: $DBI::errstr\n";
return @array;

我的下一步是更改代码以将结果作为散列而不是数组返回,但我不确定如何继续。我希望使用selectall_hashref,但我发现的所有在线示例都使用 WHILE。我想返回结果,然后将哈希创建为单独的步骤。

4

3 回答 3

8

使用该selectall_hashref方法将prepare,executefetchall_arrayref合并到一个调用中。它返回对数组的引用,该数组包含对获取的每一行数据的哈希值的引用。添加到以前的回复评论。

一种将您的selectall_arrayref调用转换为您的主键的类似哈希的详细方法ID,您可以执行类似的操作。

my %rows = ();
for my $i ( 0..$#{$sql} ) {
  my ($id, $player, $sport) = @{$sql->[$i]};
  $rows{$id} = [ $player, $sport ];  
}

现在访问它们:

foreach ( sort(keys(%rows)) ) {
   print "$_, -> $rows{$_}->[0], -> $rows{$_}->[1]\n";
}

现在使用selectall_hashref,您的电话将是这样的。ID是primary这里的关键。

my $href = $dbh->selectall_hashref( q/SELECT ID, Player, Sport 
                                      FROM Players_Sport/, q/ID/ );

要访问您的密钥,您可以通过多种方式使用,以下是一个示例:

foreach ( keys %$href ) {
   print "$_, $href->{$_}->{Player}, $href->{$_}->{Sport}\n";
}

您的主键被放置为$_,您可以通过说从哈希中访问您的个人键。

$href->{$_}->{Player}

这就像说:

foreach my $i ( keys %$href ) {
   print "$i, $href->{$i}->{Player}, $href->{$i}->{Sport}\n";
}

每个项目都在循环$i

于 2013-05-13T23:01:56.683 回答
3

使用selectall_hashref时必须告诉它使用哪一列作为唯一键。指定一个您知道每行都有唯一值的列,然后它将使用键列值作为键填充带有“行”对象的散列。每个“行”本身就是一个以列名作为键的 hashref。

从 DBI 页面:

$hash_ref = $dbh->selectall_hashref($statement, $key_field);
$hash_ref = $dbh->selectall_hashref($statement, $key_field, \%attr);
$hash_ref = $dbh->selectall_hashref($statement, $key_field, \%attr, @bind_values);

在您提供的所有三个版本中,$key_field用于标识将用作散列键的列。

于 2013-05-13T22:39:39.443 回答
0

哈希定义了两件事之间的关联,但在这种情况下,键或值是什么?假设您想要一个 1 作为值:

my %hash = map { $_, 1 } @array;

或者,

my %hash = map { $_->[0], 1 } @$sql;
于 2013-05-13T22:22:36.027 回答