код работает нормально на Perl 5.12.1 не работает на 5.10.0 - PullRequest
4 голосов
/ 13 июля 2010

Я написал некоторый код (около 100 строк), который отлично работает на версии 5.12.1.К сожалению, мой клиент использует версию 5.10.0.Поэтому я протестировал код на 5.10.0 и обнаружил, что он не работает!

Где найти список различий между 5.10 и 5.12?


Редактировать:

Я думаю, что лучший ответ на вопрос "Где я могу найти список различий между 5.10 и 5.12" - это комментарий plusplus 'под "принятым ответом".Для объяснения кода ниже, пожалуйста, прочитайте ответ Майкла Кармана .


Код, который работает на 5.12.1, но не работает на 5.10.0 ($contentsвсе еще пустая строка после выполнения кода)

# read in the first 10 lines.
my $contents = '';
for (my $i = 0; $i < 10 && ! eof; $i++) {
    $contents .= <FILE>;
}

Улучшенный код, который работает в обеих версиях.

# read in the first 10 lines.
my $contents = '';
my $i = 0;
while (<FILE>) {
    last if $i >= 10;
    $contents .= $_;
    $i++;
} 

Ответы [ 2 ]

9 голосов
/ 14 июля 2010

В вашем первом примере кода есть ошибка. Пустой eof сообщает о состоянии последнего чтения дескриптора файла. Во время первого прохождения цикла вы (предположительно) еще ничего не читали; в любом случае, ничего из FILE. Похоже, что внутреннее поведение этого неверного вызова изменилось. Под Perl 5.12.1 под управлением perl -E "say eof" ничего не печатается. Под Perl 5.10.0 он печатает «1».

Явное тестирование eof(FILE) должно решить проблему.

Касательная: Ваш код не очень идиоматичен. Более изощренный подход был бы

my $content;
while(<$fh>) {
    if ( 1 .. 10 ) { $content .= $_ }
    else           { last }
}

Используются следующие идиомы:

  • Используйте лексический дескриптор файла вместо глобуса. ($fh вместо FILE)
  • Используйте оператор диапазона .. для отслеживания количества прочитанных строк. Эта форма неявно проверяет номер строки ввода $..
  • Не проверять явно EOF (пусть цикл его обрабатывает).
  • Используйте last, чтобы рано выйти из цикла.
4 голосов
/ 13 июля 2010

Посмотрите на страницу perldoc . Вы найдете там Перлделту. Или оставьте свой код и попросите нас посмотреть его;)

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