我是perl的新手,我试图将一个csv文件(每行有10个以逗号分隔的项目)分成一个键(第一项)和一个数组(9项)放入一个哈希。最后,我想使用if
函数将另一个变量与散列中的键匹配,并打印出数组中的元素。
这是我的代码,它不能正常工作。
use strict;
use warnings;
my %hash;
my $in2 = "metadata1.csv";
open IN2, "<$in2" or die "Cannot open the file: $!";
while (my $line = <IN2>) {
my ($key, @value) = split (/,/, $line, 2);
%hash = (
$key => @value
);
}
foreach my $key (keys %hash)
{
print "The key is $key and the array is $hash{$key}\n";
}
感谢您的帮助!
答案 0 :(得分:1)
不要使用2作为split
的第三个参数:它会将行分割为仅两个元素,因此只有一个@value。
此外,通过执行%hash =
,您将在循环的每次迭代中覆盖散列。只需添加一个新的键/值对:
$hash{$key} = \@value;
请注意\
符号:您不能将数组直接存储为哈希值,您必须存储对它的引用。打印值时,您必须取消引用:
#! /usr/bin/perl
use warnings;
use strict;
my %hash;
while (<DATA>) {
my ($key, @values) = split /,/;
$hash{$key} = \@values;
}
for my $key (keys %hash) {
print "$key => @{ $hash{$key} }";
}
__DATA__
id0,1,2,a
id1,3,4,b
id2,5,6,c
如果您的CSV文件包含带引号或转义的逗号,则应使用Text::CSV。