如何在未打开的文件句柄上解决以下错误“readline()...”?

时间:2012-01-05 19:57:18

标签: perl file-io

我如何解决以下错误:

readline() on unopened filehandle UPPER at faStat2 line 86.

在以下代码中?

#!/usr/bin/perl
use strict;
use warnings;

...

my $cmd = $0;
$cmd =~ s#.*/##;

($#ARGV > 0) || die "Usage $cmd <tibcoUpperMDLog> <tibcoLowerMDLog> <outFile>\n\n";

open(my $UPPER, $ARGV[0]) || die "Unable to open $ARGV[0]\n";
open(my $LOWER, $ARGV[1]) || die "Unable to open $ARGV[1]\n";

...

while ($msg = <UPPER>) { getUpperBusTimeStampAndBatchSize(\$msg); } #This is the line that the error is complaning about

3 个答案:

答案 0 :(得分:5)

我认为你需要在$UPPER循环中使用while

while ($msg = <$UPPER>) ...

有些references在示例中对文件句柄使用非美元符号变量,但它们在句柄名称中也没有open() $。如果你问我这会让人感到困惑,但只要坚持下去,我相信你会没事的。

答案 1 :(得分:4)

在这里,我包括实用和风格的chages。

#!/usr/bin/perl
use strict;
use warnings;

...

my $cmd = $0;
$cmd =~ s#.*/##;

die "Usage $cmd <tibcoUpperMDLog> <tibcoLowerMDLog> <outFile>\n\n"
  unless @ARGV > 2;

open my $upper, '<', $ARGV[0] or die "Unable to open $ARGV[0]\n";
open my $lower, '<', $ARGV[1] or die "Unable to open $ARGV[1]\n";

...

while ($msg = <$upper>) { getUpperBusTimeStampAndBatchSize(\$msg); }

实用:

  • 3 arg open(更安全,更现代)
  • 修复了间接文件句柄的一致使用

文体:

  • 使用or而不是大括号和||(最不重要)
  • @ARGV进行比较而不是$#ARGV(更具可读性,&#34;至少需要2个参数&#34;)
  • 在词法(my)变量上使用小写

答案 2 :(得分:3)

试试while ($msg = <$UPPER>),如果你在open()中命名文件句柄$ UPPER,你在以后与文件句柄交谈时也必须使用相同的变量名。