我尝试将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
答案 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>;
缺点是无法轻易检查预期的数据格式。