我正在做一些练习来提高我的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。我想返回结果,然后创建哈希作为单独的步骤。
答案 0 :(得分:6)
使用selectall_hashref
方法将prepare
,execute
和fetchall_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
答案 1 :(得分:3)
使用selectall_hashref
时,必须告诉它使用哪个列作为唯一键。指定一个您知道每行具有唯一值的列,然后使用键列值作为键,使用“行”对象填充哈希。每个'row'本身都是一个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
来标识将用作哈希键的列。
答案 2 :(得分:0)
哈希定义了两件事之间的关联,但在这种情况下,关键或值是什么?假设您想要1作为值:
my %hash = map { $_, 1 } @array;
,或者
my %hash = map { $_->[0], 1 } @$sql;