【问题标题】:Can't call method "getline" on an undefined value无法在未定义的值上调用方法“getline”
【发布时间】:2015-12-30 04:09:16
【问题描述】:

在 perl 脚本中出现错误:

无法在未定义的值上调用方法getline

这是部分代码。我使用Text::CSV 读取文件:

my $csv = Text::CSV->new(
    {   binary       => 1,
        encoding_in  => "iso-8859-1",
        encoding_out => "cp1252",
        sep_char     => ';'
    }
);

open my $fhandle, '<:encoding(utf8)', $fileName
    or die "Cannot use CSV:" . Text::CSV->error_diag();
while ( my $fields = $csv->getline($fhandle) ) {
    push( @array, $fields->[0] );
    push( @array, $fields->[1] );
    push( @array, $fields->[2] );
}

【问题讨论】:

  • $csv 声明/分配在哪里?
  • 欢迎来到 Stack Overflow!我编辑了您的问题以包含更多信息。我还缩进了您的代码示例,以便它正确呈现 - 请参阅编辑帮助以获取有关格式的更多信息。请编辑问题并提供更多可用信息,以防有必要识别特定问题。祝你好运!
  • 我已将您对$csv 的实例编辑为上述内容,并为清晰起见稍微重新格式化了代码。请您再次检查它是否仍然正确?

标签: perl csv


【解决方案1】:

该错误消息特别表示变量$csv 未定义。

您是否正确实例化它?来自Text::CSV的文档:

my $csv = Text::CSV->new ( { binary => 1 } )  # should set binary attribute.
             or die "Cannot use CSV: ".Text::CSV->error_diag ();

检查您的代码是否有类似这样的行(可能有不同的选项,这并不重要)。

请注意,您对die 的错误 - 与Text::CSV 无关,它是一个常规文件打开。因此:

die "Cannot use CSV:".Text::CSV->error_diag ();

具有误导性。如果您的open 失败,它仍然会出错,但它不会正确报告问题。你应该改为:

die "Error opening file: $!"; 

编辑:来自您正在使用的 cmets:

use Text::CSV;
my $csv = Text::CSV->new ({binary => 1, encoding_in => "iso-8859-1", encoding_out => "cp1252", sep_char => ';'});

尝试将其更改为:

my $csv = Text::CSV->new(
    {   binary       => 1,
        encoding_in  => "iso-8859-1",
        encoding_out => "cp1252",
        sep_char     => ';'
    }
) or die "Cannot use CSV: " . Text::CSV->error_diag();

你会得到以下错误:

Cannot use CSV: INI - Unknown attribute 'encoding_in' at line 2. 

因此,您没有成功实例化您的 $csv 对象,这就是您收到错误的原因。

您在Text::CSV 中引用的代码如下所示:

use Text::CSV::Encoded;
my $csv = Text::CSV::Encoded->new ({
    encoding_in  => "iso-8859-1", # the encoding comes into   Perl
    encoding_out => "cp1252",     # the encoding comes out of Perl
});

例如使用不同的模块 - Text::CSV::Encoded

【讨论】:

  • 好的。从中捕获错误,因为那是失败的。
  • 变量 $csv 是这样定义的
  • 已编辑答案。这是你的问题:Cannot use CSV:INI - Unknown attribute 'encoding_out'。你需要使用http://search.cpan.org/~makamaka/Text-CSV-Encoded-0.22/lib/Text/CSV/Encoded.pm
  • my $csv = Text::CSV->new ({binary => 1, encoding_in => "iso-8859-1", encoding_out => "cp1252", sep_char => ';' });
  • 如果您还有其他问题,那么值得单独提问。
【解决方案2】:

错误的 open() 导致 getline 错误

修改:

open my $fh, "<:encoding(utf8)", "test.csv" or die "test.csv: $!";
while ( my $row = $csv->getline( $fh ) ) {
}

因为用 $file 代替“test.csv”会产生问题。

my $csv = Text::CSV->new ({binary=>1}) ;
$file = "test.csv" ;
if(!open($fh, "<", $file )) {
  # Cannot call getline is a symptom of a bad open() 
  printf("### Error %s: could not open file %s\n", $ws, $file) ;
  close($fh) ;
  exit 1 ; 
}
while(my $row = $csv->getline($fh)) {
  @items = @{$row} ;
  for(my $i=0 ; $i<=$#items; $i++) {
    printf("Field %d: (%s)\n", $i, $items[$i] ) ;
  }
}

【讨论】:

    猜你喜欢
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    相关资源
    最近更新 更多