访问用于列规范的 "pair hash" 个引用

accessing "pair hash" references used for column specification

我正在构建一个小型库,用于将日志数据转换为 CSV-like 可以通过电子表格软件导入的文件。对于输出,如果需要,我对显示 table 列的 human-friendly 标题的选项感兴趣。这应该是一个选项,以便该工具也可以轻松使用。我想出了一个用于列规范的数组,其中包含键的纯标量或具有一对键和值的散列引用。我通过对我来说有点奇怪的键和值访问这些。

是否有更简单的方法来访问仅包含一对的散列的键和值?

(我尽量简化了代码。)

#!/usr/bin/perl -w
use strict;
use warnings;

# some sample data
my @rows = (
    {x => 1, y => 2},
    {y => 5, z => 6},
    {x => 7, z => 9},
);

sub print_table {
    my @columns = @_; # columns of interest with optional header replacement
    my @keys; # for accessing the data values 
    my @captions; # for display on column headers
    for (@columns) {
        if (ref($_) eq 'HASH') {
            push @keys, keys %$_;
            push @captions, values %$_;
        } else {
            push @keys, $_;
            push @captions, $_;
        }
    }
    print join ("\t", @captions), "\n";
    for my $row (@rows) {
        print join ("\t", (map {$row->{$_} // ''} @keys)), "\n";
    }
}

print_table({x=>'u'}, 'y');

使用each.

来自perldoc

When called on a hash in list context, returns a 2-element list consisting of the key and value for the next element of a hash.

但不要忘记在之后使用 keys(%hash) 重置迭代器,否则后续 each 将失败。

my ($k, $v) = each(%$_);
keys(%$_);

所有你需要的:

my ($k, $v) = %hash;

所以

my ($k, $v) = %$_;
push @keys,     $k;
push @captions, $v;

push @keys,     ( %$_ )[0];
push @captions, ( %$_ )[1];