2014-03-25 83 views
0

我在Perl脚本中有一个子例程,它打开一个csv文件并将值读入散列表。该脚本当前在Windows 2003服务器上运行时没有问题。我试图让脚本在Windows 2008 R2服务器上运行。当我在R2上运行脚本时,它失败,出现以下错误:无法通过软件包“C:\ file \ test.csv”找到对象方法“getLine”(也许您忘记加载“C:\ file \ test .csv)Perl脚本无法加载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 
} 

我已经证实,有完整的目录正确的文件名是在$文件名。我ALOS确保了IO ::文件模块安装。为什么赢了此代码是否打开csv文件?

谢谢, 亚历克斯

回答

5

getline需要一个文件句柄作为参数,但你传递文件。更改

while(my $colref = $csv->getline ($filename)) 

while(my $colref = $csv->getline ($csv_fh)) 
2

IO::File模块有时是有益的,如果你想要把你的文件句柄作为一个对象,但它是最好的一般使用Perl的原生open运营商。

如前所述,问题在于打开文件后没有使用文件句柄:您应该将它传递给Text::CSVgetline方法。

此外,您将散列元素的值设置为数组引用$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; 
} 
+0

这行不符合OP的意图:'$ output_hash {$ row - > [0]} = $ row - > [1];'。看起来她有一个价值清单,第一个是关键 – Miller