Как бы я решить следующую ошибку "readline () на неоткрытом дескрипторе файла ..."? - PullRequest
1 голос
/ 05 января 2012

Как мне решить следующую ошибку:

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 ]

5 голосов
/ 06 января 2012

Я считаю, что вам нужно использовать $UPPER внутри цикла while:

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

Некоторые ссылки используют переменные без знака доллара в качестве дескрипторов файлов в примерах, ноони также open() без $ в имени дескриптора.Это сбивает с толку, если вы спрашиваете меня, но просто придерживайтесь одного или другого, и я верю, что вы будете в порядке.

4 голосов
/ 06 января 2012

Здесь я включаю как практические, так и стилистические аспекты.

#!/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 аргумента")
  • использовать строчные буквы для лексических (my) переменных
3 голосов
/ 06 января 2012

Попробуйте while ($msg = <$UPPER>), если вы называете файловый дескриптор $ UPPER в open (), вы должны использовать то же имя переменной при обращении к файловому дескриптору позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...