Perl逐行读取

时间:2010-12-22 01:05:52

标签: perl

我有一个简单的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);

5 个答案:

答案 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                         ;