2012-01-05 25 views
0

我將如何解決以下錯誤:我如何解決以下錯誤「readline()在faStat2第86行的未打開的文件句柄UPPER上。」?

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

在這裏,我包括實用和文體的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精氨酸open(更安全,現代)
  • 固定一貫使用的文件句柄間接

文體的:使用or大鼠

  • 她比括號和||(最重要的)
  • 比較反對@ARGV而非$#ARGV(更具可讀性,「至少需要2 ARGS」)
  • 使用小寫的詞彙(my)變量
5

我相信你需要使用$UPPERwhile循環中:

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

一些references使用在實例文件句柄非美元符號的變量,但他們也open()沒有在該$處理名稱。如果你問我,這很讓人困惑,但只要堅持一下,我相信你會沒事的。

+2

裸字的文件句柄是一個古老的功能。對於現代代碼,你應該使用詞法文件句柄(比如'$ UPPER'而不是'UPPER')。你還應該使用3參數版本的'open'。請參閱[本文](http://www.modernperlbooks.com/mt/2010/04/three-arg-open-migrating-to-modern-perl.html)。 – 2012-01-05 20:43:27

3

嘗試while ($msg = <$UPPER>),如果您在open()中命名文件句柄$ UPPER,則以後也必須在與文件句柄交談時使用相同的變量名稱。

相關問題