61 votes

Perl lu ligne par ligne

J'ai un simple script Perl pour lire un fichier ligne par ligne. Le code est ci-dessous. Je veux afficher deux lignes et casser la boucle. Mais ça ne marche pas. Où est le bug?

 $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);
 

124voto

friedo Points 36209

Si vous aviez use strict activé, vous auriez découvert que $++foo n'a aucun sens.

Voici comment le faire:

 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;
 

Ceci tire parti de la variable spéciale $. qui garde trace du numéro de ligne dans le fichier actuel. (Voir perlvar )

Si vous souhaitez utiliser un compteur à la place, utilisez

 my $count = 0;
while( my $line = <$info>)  {   
    print $line;    
    last if ++$count == 2;
}
 

12voto

Evan Carroll Points 13420

Avec ces types de programmes complexes, il est préférable de laisser PERL générer le code PERL pour vous:

 $ perl -MO=Deparse -pe'exit if $.>2'
 

Ce qui se fera un plaisir de vous dire la réponse,

 LINE: while (defined($_ = <ARGV>)) {
    exit if $. > 2;
}
continue {
    die "-p destination: $!\n" unless print $_;
}
 

Alternativement, vous pouvez simplement l'exécuter en tant que tel à partir de la ligne de commande,

 $ perl -pe'exit if$.>2' file.txt
 

5voto

Doon Points 7858

vous devez utiliser ++$counter , pas $++counter , d’où la raison pour laquelle cela ne fonctionne pas ..

-5voto

tchrist Points 47116
#!/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                         ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X