2011-04-13 96 views
0

我不是一个程序员,也不是Perl的新手。我目前正在编写一个脚本来读取CSV文件,在不同的字段上做一些评估,然后在符合某些标准的情况下打印到另一个文件。我以为我几乎完成,但后来我得到这个新的消息:`Usage:Text :: CSV_Xs :: getline(self,io)`是什么意思?

“用法:文本:: CSV_Xs ::函数getline(个体经营,IO)在date_compare.pl 51行,3行”

我一直想找到的东西,告诉我这是什么消息意味着,但我迷路了。我知道这很简单。我的代码如下。请原谅我的无知。

#! /usr/local/ActivePerl-5.12/bin/perl 

#this script will check to files, throw them into arrays and compare them 
#to find entries in one array which meet specified criteria 
#$field_file is the name of the file that contains the ablation date first, 
#then the list of compared dates, then the low and high end date criteria, each 
#value should end with a \n. 
#$unfiltered_file is the name of the raw CSV with all the data 
#$output_file is the name of the file the program will write to 
use strict; 
use 5.012; 
use Text::CSV_XS; 
use IO::HANDLE qw/getline/; 
use Date::Calc qw/Decode_Date_US2 Delta_Days/; 

my $csv = Text::CSV_XS->new ({ binary => 1, eol => $/ }) or 
    die "Cannot use CSV: ".Text::CSV->error_diag(); 

my ($field_file, 
    $unfiltered_file, 
    $output_file, 
    @field_list, 
    $hash_keys, 
    %compare, 
    $check, 
    $i); 
#Decode_Date_US2 scans a string and tries to parse any date within. 
#($year,$month,$day)=Decode_Date_US2($string[,$language]) 
#Delta_Days returns the difference in days between the two given dates. 
#$Dd = Delta_Days($year1,$month1,$day1, $year2,$month2,$day2); 
sub days{ 
    Delta_Days(Decode_Days_US2(@compare{$field_list[0]}), 
      Decode_Days_US2(@compare{$field_list[$i]})); 
} 

sub printout{ 
    $csv->print(<OUTPUTF>, $check) or die "$output_file:".$csv->error_diag(); 
} 

print "\nEnter the check list file name: "; 
chomp ($field_file = <STDIN>); 
open FIELDF, "<", $field_file or die "$field_file: $!"; 
chomp (@field_list=<$field_file>); 
close FIELDF or die "$field_file: $!"; 
print "\nEnter the raw CSV file name: "; 
chomp ($unfiltered_file = <STDIN>); 
print "\nEnter the output file name : "; 
chomp ($output_file = <STDIN>); 
open OUTPUTF, ">>", $output_file or die "$output_file: $!"; 
open RAWF, "<", $unfiltered_file or die "$unfiltered_file: $!"; 
if ($hash_keys = $csv->getline(<RAWF>)){ 
    $check = $hash_keys; 
    &printout(); 
}else{die "\$hash_keys: ".$csv->error_diag();} 

while ($check = $csv->getline (<RAWF>)){ 
    @compare{@$hash_keys}[email protected]$check;  
    TEST: for ($i=1, $i==(@field_list-3), $i++){ 
     if (&days()>=$field_list[-2] && &days()<=$field_list[-1]){ 
      last TEST if (&printout()); 
    } 
}  

回答

3
Usage: Text::CSV_Xs::getline(self, io) at date_compare.pl line 51, line 3. 

getline显然期望一个文件句柄/ IO ::处理,而你传递一个标量(包含从文件句柄读取线)。

这意味着,在您的线路:

if ($hash_keys = $csv->getline(<RAWF>)){ 

您应该使用:

if ($hash_keys = $csv->getline(\*RAWF)){ 

代替。

(但你确实应该使用词法文件句柄,如:)

open FIELDF, "<", $field_file or die "$field_file: $!"; 
chomp (@field_list=<$field_file>);  # Not sure how you expect this to work 
close FIELDF or die "$field_file: $!"; 

将成为:有时

open my $fieldf, "<", $field_file or die "$field_file: $!"; 
chomp (@field_list=<$fieldf>); 
close $fieldf or die "$field_file: $!"; 
+1

'\ * RAWF',但'* RAWF'和'RAWF'也工作。 – ikegami 2011-04-14 01:01:45

+0

干杯,谢谢。更新。 – 2011-04-14 02:11:57