2010-12-22 237 views
50

我有一個簡單的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); 
+10

`use strict;使用警告;`會解決你所有的問題。 – 2010-12-22 01:11:29

+7

解析爲`($ + +'counter')== 2` – 2010-12-22 01:44:37

+0

請不要再使用舊式的FILEHANDLES。 – 2014-05-23 14:50:23

回答

100

如果你已經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; 
} 
5

你需要使用++$counter$++counter,因此它是不工作的原因..

+4

此外,OP初始化`$ count`,然後嘗試增加`$ counter`,這隻能用,因爲OP不使用`strict`或`warnings`。 – 2010-12-22 01:11:02

-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       ; 
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 
0

在bash foo是變量的名稱,以及$是操作者,這意味着「得到」的值。

perl $foo是變量的名稱。