首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >像使用selectall_arrayref一样使用selectall_hashref

像使用selectall_arrayref一样使用selectall_hashref
EN

Stack Overflow用户
提问于 2013-05-14 06:15:26
回答 3查看 13.9K关注 0票数 3

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

代码语言:javascript
复制
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。我想返回结果,然后创建散列作为单独的步骤。

EN

回答 3

Stack Overflow用户

发布于 2013-05-14 07:01:57

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

将您的selectall_arrayref调用转换为类似的散列(其中ID是您的主键)的冗长方法,您可以这样做。

代码语言:javascript
复制
my %rows = ();
for my $i ( 0..$#{$sql} ) {
  my ($id, $player, $sport) = @{$sql->[$i]};
  $rows{$id} = [ $player, $sport ];  
}

现在来访问它们:

代码语言:javascript
复制
foreach ( sort(keys(%rows)) ) {
   print "$_, -> $rows{$_}->[0], -> $rows{$_}->[1]\n";
}

现在使用selectall_hashref,你的调用应该是这样的。ID是这里的primary密钥。

代码语言:javascript
复制
my $href = $dbh->selectall_hashref( q/SELECT ID, Player, Sport 
                                      FROM Players_Sport/, q/ID/ );

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

代码语言:javascript
复制
foreach ( keys %$href ) {
   print "$_, $href->{$_}->{Player}, $href->{$_}->{Sport}\n";
}

您的主键被放置为$_,您可以通过以下语句从散列中访问您的各个键。

代码语言:javascript
复制
$href->{$_}->{Player}

再一次,这就像是在说:

代码语言:javascript
复制
foreach my $i ( keys %$href ) {
   print "$i, $href->{$i}->{Player}, $href->{$i}->{Sport}\n";
}

每一项都在$i中循环

票数 7
EN

Stack Overflow用户

发布于 2013-05-14 06:39:39

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

在DBI页面中:

代码语言:javascript
复制
$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来标识将用作散列键的列。

票数 3
EN

Stack Overflow用户

发布于 2013-05-14 06:22:36

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

代码语言:javascript
复制
my %hash = map { $_, 1 } @array;

或,

代码语言:javascript
复制
my %hash = map { $_->[0], 1 } @$sql;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16532041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档