gpt4 book ai didi

arrays - 通过 Perl 中的哈希引用数组获取切片

转载 作者:行者123 更新时间:2023-12-04 22:58:10 27 4
gpt4 key购买 nike

我有一个与 Perl 相关的问题,涉及复杂的数据结构。我在托管 Apache 的 Linux (Centos v5) 服务器上运行 5.8.8 版的 Perl。我正在询问一个 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 专家可以帮助我,我将不胜感激。

谢谢

CJ

最佳答案

有几件事要开始:

这不是您定义哈希的方式:

my %datarow1 = {"firstname"=> "dave", "bar"=>"smith"};

这行代码将 Hash 引用分配给 Hash,从而产生如下结构:
( 'HASH(0x7f4ef0545e18)' => undef )

可能不是你想要的。

要正确定义散列,请用括号替换花括号:
my %datarow1 = ("firstname"=> "dave", "bar"=>"smith");

始终启用严格模式和警告:
use strict;
use warnings;

这会发现分配对哈希的引用的错误。

--

现在,真正的问题是“如何从数组中保存的哈希引用中提取特定键?”

答案与哈希引用不在数组中的方式完全相同:
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

关于arrays - 通过 Perl 中的哈希引用数组获取切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35464519/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com