Perl читается по строкам
У меня есть простой 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);
Ответы
Ответ 1
Если вы включили 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;
}
Ответ 2
С помощью этих типов сложных программ лучше всего позволить 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
Ответ 3
вам нужно использовать ++$counter
, а не $++counter
, поэтому причина не работает.
Ответ 4
В bash foo
указано имя переменной, а $
- это оператор, который означает "получить значение".
В perl $foo
указано имя переменной.
Ответ 5
#!/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 ;