Perl читать построчно

49

У меня есть простой Perl script для чтения файла по строкам. Код ниже. Я хочу отобразить две строки и разбить цикл. Но это не сработает. Где ошибка?

$file='SnPmaster.txt';
open(INFO, $file) or die("Could not open  file.");

$count = 0; 
foreach $line (<INFO>)  {   
    print $line;    
    if ($++counter == 2){
      last;
    }
}
close(INFO);
  • 10
    use strict; use warnings; решит все ваши проблемы
  • 7
    анализируется как ($+ + 'counter') == 2
Показать ещё 1 комментарий
Теги:

5 ответов

97
Лучший ответ

Если вы включили use strict, вы бы узнали, что $++foo не имеет никакого смысла.

Вот как это сделать:

use strict;
use warnings;

my $file = 'SnPmaster.txt';
open my $info, $file or die "Could not open $file: $!";

while( my $line = <$info>)  {   
    print $line;    
    last if $. == 2;
}

close $info;

Это использует специальную переменную $., которая отслеживает номер строки в текущем файле. (См. perlvar)

Если вы хотите использовать счетчик, используйте

my $count = 0;
while( my $line = <$info>)  {   
    print $line;    
    last if ++$count == 2;
}
  • 22
    +1, но for my $line (<$filehandle>) считывает весь файл во временный список, который может тратить память. while(my $line = <$filehandle>) работает так же хорошо (и Perl правильно интерпретирует его как значение while(defined(my $line = <$filehandle>)) так что пустые строки не портят его) без чтения весь файл без необходимости.
  • 0
    Хороший вопрос, не могу поверить, что я пропустил это
Показать ещё 1 комментарий
11

С помощью этих типов сложных программ лучше всего позволить Perl генерировать для вас код Perl:

$ perl -MO=Deparse -pe'exit if $.>2'

Что с радостью скажет вам ответ,

LINE: while (defined($_ = <ARGV>)) {
    exit if $. > 2;
}
continue {
    die "-p destination: $!\n" unless print $_;
}

В качестве альтернативы вы можете просто запустить его как таковой из командной строки,

$ perl -pe'exit if$.>2' file.txt
5

вам нужно использовать ++$counter, а не $++counter, поэтому причина не работает.

  • 4
    Кроме того, OP инициализирует $count а затем пытается увеличить $counter , это работает только потому, что OP не использует strict или warnings .
  • 0
    Да ты прав. Я включаю -w, я вижу предупреждение. Но он показывает и другие предупреждения: Имя «main :: count» используется только один раз: возможная опечатка в строке hello.pl 6. Имя «main :: counter» используется только один раз: возможная опечатка в строке hello.pl 9.
0

В bash foo указано имя переменной, а $ - это оператор, который означает "получить значение".

В perl $foo указано имя переменной.

-2
#!/usr/bin/perl
use utf8                       ;
use 5.10.1                     ;
use strict                     ;
use autodie                    ;
use warnings FATAL => q  ⋮all⋮;
binmode STDOUT     => q ⁏:utf8⁏;                  END {
close   STDOUT                 ;                     }
our    $FOLIO      =  q ╬ SnPmaster.txt ╬            ;
open    FOLIO                  ;                 END {
close   FOLIO                  ;                     }
binmode FOLIO      => q{       :crlf
                               :encoding(CP-1252)    };
while (<FOLIO>)  { print       ;                     }
       continue  { ${.} ^015^  __LINE__  ||   exit   }
                                                                                                                                                                                                                                              __END__
unlink  $FOLIO                 ;
unlink ~$HOME ||
  clri ~$HOME                  ;
reboot                         ;
  • 29
    Извините, но что это за мир?
  • 1
    @JohannesErnst Да, именно так.
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню