У меня есть простой 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);
Если вы включили 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;
}
for my $line (<$filehandle>)
считывает весь файл во временный список, который может тратить память. while(my $line = <$filehandle>)
работает так же хорошо (и Perl правильно интерпретирует его как значение while(defined(my $line = <$filehandle>))
так что пустые строки не портят его) без чтения весь файл без необходимости.
С помощью этих типов сложных программ лучше всего позволить 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
вам нужно использовать ++$counter
, а не $++counter
, поэтому причина не работает.
$count
а затем пытается увеличить $counter
, это работает только потому, что OP не использует strict
или warnings
.
В bash foo
указано имя переменной, а $
- это оператор, который означает "получить значение".
В perl $foo
указано имя переменной.
#!/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 ;
use strict; use warnings;
решит все ваши проблемы($+ + 'counter') == 2