Perl中散列键的子集

Perl中散列键的子集,perl,hash,Perl,Hash,我发现自己正在编写一个Perl脚本,作为我正在使用的特定格式的库,它只适用于这种语言。该脚本读取CSV文件并将数据保存为专有格式。我只需要保存特定的列,而不是整个数据集,因此我想出了一种使用以下代码按列名访问列的方法 my $file = "test.csv"; open my $fh, "<", $file or die "$file: $!"; my $csv = Text::CSV->new ({ binary => 1, # Allow special ch

我发现自己正在编写一个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};
}

但是在我的例子中,
$row
不是一个散列,而是一个引用(我说得对吗?),所以我不太明白如何实现我所需要的。谢谢你的帮助!谢谢

通常,您可以通过在
{}
块中将变量名替换为引用,在任何语法中使用引用(或生成引用的表达式)。因此:

@hash{qw(header_one header_two)}
会是

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

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

但这只是返回两个值的散列切片;如果需要键/值列表,请使用键/值切片(perl 5.20中新增的):


你需要一个hash-ref切片,如果你刚刚学会了Perl,你的代码真的很好,你已经完成了你的家庭作业。很高兴看到这样的问题。:)看见
@{$row}{qw(header_one header_two)}
@$row{qw(header_one header_two)}
my %slice = %$row{qw(header_one header_two)};