我如何解决以下错误:
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
答案 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); }
实用:
open
(更安全,更现代)文体:
or
而不是大括号和||
(最不重要)@ARGV
进行比较而不是$#ARGV
(更具可读性,&#34;至少需要2个参数&#34;)my
)变量上使用小写答案 2 :(得分:3)
试试while ($msg = <$UPPER>)
,如果你在open()中命名文件句柄$ UPPER,你在以后与文件句柄交谈时也必须使用相同的变量名。