【问题标题】:Parse a CSV into Perl hash in a sub and return the value passed to that sub将 CSV 解析为 sub 中的 Perl 哈希并返回传递给该 sub 的值
【发布时间】:2018-01-17 23:28:06
【问题描述】:

我尝试在 sub 中将 csv 解析为 perl 中的哈希,然后返回作为参数传递给 sub 的键值。 CSV 文件是这样的:

host1, 12121
host2, 34324252345
host3, 45345
host4, 56363425
host5, 3.1
hostn, 435345

我的代码是这样的:

#!/usr/bin/perl -w
my $host_key = getValue('host1');
print $host_key;
sub getValue {
    my $host_file = 'test.csv';
    my $hostname = $_[0];
    chomp($hostname);
    my %hash;
    open my $fh, '<', $host_file or die "Cannot open: $!";
    while (my $line = <$fh>) {
        my @hostname_lines = split /,/, $line;
        my $hostname = shift @hostname_lines;
        $hash{$hostname} = \@hostname_lines;
    }
    close $fh;
    my $host_value = $hash{$hostname};
    return $host_value;
}

当我运行此代码时,我的返回值为 ARRAY(0x6b72d0),但我希望返回值为 12121

【问题讨论】:

  • 我的 $host_value = $hash{'host1'} 所以我希望 $host_value = 12121
  • 已发布,直接修复该错误,以及其他一些选项。 (我删除了我发布的一些 cmets。)

标签: arrays perl csv hash reference


【解决方案1】:

您在while 循环内构建一个值为arrayrefs 的散列。

所以你需要在那个arrayref中检索一个元素

my %host;
...
my $host_value = $host{$name}->[0];

什么也可以写成

my $host_value = $host{$name}[0];

原来的数组是shifted,所以这个数字现在是arrayref中的第一个元素。


也可以这样做

while (my $line = <$fh>) {
    my ($name, @numbers) = split /\s*,\s*/, $line;
    $host{$name} = \@numbers;
}

因为split 的返回列表中的第一个元素进入第一个标量,其余进入数组。


数据在每行显示一个主机的一个数字。如果总是这样,则不需要数组引用

my %host;
while (my $line = <$fh>) {
    my ($name, $val) = split /\s*,\s*/, $line;
    $host{$name} = $val;
}

/\s*,\s*/ 也会修剪空格,甚至

my %host = map { split /\s*,\s*/ } <$fh>;

它的缺点是无法轻松检查预期的数据格式。

【讨论】:

    猜你喜欢
    • 2012-06-21
    • 1970-01-01
    • 2018-07-04
    • 2023-03-19
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多