将CSV解析为sub中的Perl哈希值,并返回传递给该子域的值

时间:2017-08-09 22:13:01

标签: arrays perl csv hash reference

我尝试将sub中的csv解析为perl中的hash,然后返回传递给sub作为参数的key的值。 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

1 个答案:

答案 0 :(得分:2)

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

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

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

什么也可以写成

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

原始数组已被shift编辑,因此数字现在是arrayref中的第一个元素。

这也可以作为

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

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

数据显示每行主机的一个数字。如果总是如此,则不需要arrayref

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>;

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