web-dev-qa-db-fra.com

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);
61
user534009

Si tu avais use strict allumé, 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 profite de la variable spéciale $. qui garde la 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;
}
116
friedo

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
12
Evan Carroll

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

5
Doon

En bash foo est le nom de la variable, et $ est un opérateur qui signifie 'obtenir la valeur de'.

En Perl $foo est le nom de la variable.

0
jwg