Perl中哈希键的子集

4

我发现我需要编写一个Perl脚本作为库,因为我所使用的特定格式只有这种语言可用。该脚本读取CSV文件并将数据保存为专有格式。我只需要保存特定列,而不是整个数据集,因此我想到了一种方法,使用以下代码按列名访问列。

my $file = "test.csv";
open my $fh, "<", $file or die "$file: $!";

my $csv = Text::CSV->new ({
  binary    => 1, # Allow special character. Always set this
  auto_diag => 1, # Report irregularities immediately
  });
$csv->column_names ($csv->getline ($fh)); # use header
while (my $row = $csv->getline_hr ($fh)) {
  print $row->{column_name};
}

在一个 while 循环内,我希望获得一个仅包含我需要列的哈希表,而不是整个记录。我想到可以通过以下方式使用哈希表来实现:

@hash{qw(header_one header_two)}

但在我的情况下,$row 不是哈希而是一个引用(我对此正确吗?),所以我无法完全弄清楚如何实现我所需要的功能。感谢您的帮助!谢谢!


你想要一个哈希引用切片。 - simbabque
4
如果你刚学Perl来完成这个任务,那么你的代码真的非常好,你做了足够的功课。很高兴看到这样的问题。 :) - simbabque
请返回仅翻译文本: 参见http://perlmonks.org/?node=References+quick+reference - ysth
1个回答

2

通常情况下,您可以在任何语法中使用引用(或生成引用的表达式),只需将变量名替换为引用,并放置在{}块中即可。所以:

@hash{qw(header_one header_two)}

would be

@{$row}{qw(header_one header_two)}

或者

@$row{qw(header_one header_two)}

(如果引用是一个简单的标量变量,则可以省略{}。)

但这只是返回两个值的哈希切片; 如果您想要一个键/值列表,请改用键/值切片(在Perl 5.20中新增):

(Original Answer翻译成“最初的回答”)

my %slice = %$row{qw(header_one header_two)};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接