我有一个与Perl相关的问题,涉及复杂的数据结构。我在托管Apache的Linux(Centos v5)服务器上运行Perl版本5.8.8。我正在询问MS-SQL数据库。我正在使用“DBI”Perl模块。
我有一个SQL查询结果表,编码为对哈希引用数组的引用。因此,表中的每一行都是一个包含哈希引用的数组元素,使用DBI模块的“fetchrow_hashref”命令获得。每个哈希的键对应于列标题和对应于该列标题下表中特定单元格的值。
我想要做的是获取一列列数据。似乎在DBI文档中描述了一些关于如何获取列数据的方法,但对我来说它们有点不透明,一般都知道如何通过一组哈希引用获取切片作为练习了解perl引用/解除引用的工作原理。
所以,基本上,鉴于此:
my %datarow1 = {"firstname"=> "dave", "bar"=>"smith"};
my %datarow2 = {"firstname"=> "john", "bar"=>"doe"};
my %datarow3 = {"firstname"=> "kim", "bar"=>"kardashian"};
像这样引用:
my @rows = (\%datarow1, \%datarow2, \%datarow3);
my $rowsref=\@rows;
如何获得此阵列?:
("dave", "john", "kim")
我试过这个:
my @columndata=@$rowsref->[0]{"firstname"}
但这只能得到列中的第一个单元格(即包含一个元素“dave”的数组)。 必须有一种优雅的方式在一行中做到这一点 - 如果你的perl大师可以帮助我,我会非常感激。
由于
C J
答案 0 :(得分:6)
要开始的一些事情:
这不是你如何定义哈希:
my %datarow1 = {"firstname"=> "dave", "bar"=>"smith"};
这行代码为Hash分配一个哈希引用,这会产生如下结构:
( 'HASH(0x7f4ef0545e18)' => undef )
可能不是你想要的。
要正确定义哈希,请用括号替换花括号:
my %datarow1 = ("firstname"=> "dave", "bar"=>"smith");
始终启用严格模式和警告:
use strict;
use warnings;
这会错误地分配对哈希的引用。
-
现在,真正的问题是"如何从数组中保存的哈希引用中提取特定键?"
,答案与Hash引用不在数组中的方式完全相同:
my $h_ref = { a => b };
# get key 'a'
my $a = $h_ref->{a};
唯一的区别在于您需要在数组上应用此操作。在数组上应用操作是map
内置的目的:
use strict;
use warnings;
my %datarow1 = ("firstname"=> "dave", "bar"=>"smith");
my %datarow2 = ("firstname"=> "john", "bar"=>"doe");
my %datarow3 = ("firstname"=> "kim", "bar"=>"kardashian");
my @rows = (\%datarow1, \%datarow2, \%datarow3);
my $rowsref=\@rows;
my @firstnames = map { $_->{firstname} } @$rowsref;
# dave john kim
答案 1 :(得分:3)
如果您已使用use strict; use warnings;
,则会获得:
参考文献找到了在“script”“line”
预期的偶数大小的列表
您想要填充哈希,请使用:
my %datarow1 = ("firstname"=> "dave", "bar"=>"smith");
注意括号而不是花括号
然后,要打印名字,请使用:
my @columndata = map {$_->{"firstname"}} @$rowsref;
say Dumper\@columndata;
答案 2 :(得分:0)
[编辑:已经回答,但我正在为此TIMTOWDI
- ness]
使用perl5.22.0
您也可以:
use experimental 'refaliasing';
for \my %hash (\%datarow2, \%datarow1, \%datarow3 ) {
say $hash{"firstname"} ;
}
请参阅Perl Tricks article on new 5.22 features了解@ bdfoy对此功能的看法。
perl5.20.0
介绍了可能与您相关的Key/Value slices。