2017-08-09 10 views
0

我尝试将一个csv解析为perl中的哈希,然后返回作为参数传递给sub的key的值。 CSV文件是这样的:将一个CSV解析为Perl中的哈希并返回传递给该子的值

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

当我运行这段代码,我的返回值是阵列(0x6b72d0),但我期望的12121

返回值
+0

my $ host_value = $ hash {'host1'} 所以我期望$ host_value = 12121 – JavaRed

+0

发布,直接修复这个错误,以及其他一些选项。 (我删除了我发布的一些评论。) – zdim

回答

2

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

所以你需要在数组引用检索元素

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

什么也可以写为

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

这里原来阵列已经shift ED这样的数量现在是第一要素在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>; 
具有不能够很容易地检查预期的数据格式的弱点

相关问题