我在Perl脚本中有一个子例程,它打开一个csv文件并将值读入哈希表。该脚本当前在Windows 2003服务器上运行时没有问题。我试图让脚本在Windows 2008 R2服务器上运行。当我在R2上运行脚本时,它失败并出现以下错误:无法找到对象方法" getLine"通过包" C:\ file \ test.csv" (也许你忘了加载" C:\ file \ test.csv)
我从包含Perl脚本和csv文件的目录中的命令行运行脚本。我可以使用move()函数重命名csv文件。显然,正在找到csv文件,它只是没有被读取。
sub csv_file_hashref {
my ($filename) = @_;
my $csv_fh = IO::File->new($filename, 'r');
my $csv = Text::CSV_XS->new ();
my %output_hash;
while(my $colref = $csv->getline ($filename))
{
$output_hash{shift @{$colref}} = $colref;
}
return \%output_hash; # return a reference to the hash
}
我已确认包含完整目录的正确文件名是$ filename。我确保安装了IO :: File模块。为什么这个代码不会打开csv文件?
谢谢, 亚历克斯
答案 0 :(得分:5)
getline
将文件句柄作为参数,但您要传递文件 name 。变化
while(my $colref = $csv->getline ($filename))
到
while(my $colref = $csv->getline ($csv_fh))
答案 1 :(得分:2)
如果您希望将文件句柄视为对象,IO::File
模块有时很有用,但最好使用Perl的本机open
运算符。
如前所述,问题是您在打开文件后没有使用文件句柄:您应该将其传递给Text::CSV
getline
方法。
此外,您将散列元素的值设置为数组引用$colref
,而不是它引用的数组的第二个元素的值。
这是一个整理的子程序版本,并修复了这些点。
sub csv_file_hashref {
my ($filename) = @_;
open my $csv_fh, '<', $filename or die qq{Unable to open "$filename" for input: $!};
my $csv = Text::CSV_XS->new;
my %output_hash;
while (my $row = $csv->getline($csv_fh)) {
$output_hash{$row->[0]} = $row->[1];
}
return \%output_hash;
}