我有一个简单的Perl脚本来逐行读取文件。代码如下。我想显示两行并打破循环。但它不起作用。错误在哪里?
$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);
答案 0 :(得分:116)
如果您启用了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;
}
答案 1 :(得分:12)
使用这些类型的复杂程序,最好让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
答案 2 :(得分:5)
你需要使用++$counter
,而不是 $++counter
,因此它无法正常工作..
答案 3 :(得分:0)
在bash foo
中是变量的名称,而$
是一个运算符,表示'获取'的值。
在perl $foo
中是变量的名称。
答案 4 :(得分:-4)
#!/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 ;