Perl: Bouclage sur les lignes d'entrée avec une approche indicielle
-
23-08-2019 - |
Question
Ceci est une question débutant-les meilleures pratiques en Perl. Je suis nouveau dans cette langue. La question est:
Si je veux traiter les lignes de sortie d'un programme, comment puis-je formater la première ligne d'une manière spéciale?
Je pense à deux possibilités:
1) Une variable de drapeau, une fois que la boucle est exécutée première fois est activé. Mais il sera évalué pour chaque cycle. solution BAD
2) Une boucle indexée (comme un « pour »). Ensuite, je commencerais la boucle i = 1. Cette solution est beaucoup mieux. Le problème est COMMENT PUIS-JE FAIRE?
Je viens de trouver le code pour une boucle sur la construction while (<>).
Ici vous pouvez voir mieux:
$command_string = "par-format 70j p0 s0 < " . $ARGV[0] . "|\n";
open DATA, $command_string or die "Couldn't execute program: $!";
print "\t <div>          |-- <strong>Description</strong></div>\n";
while ( defined( my $line = <DATA> ) ) {
chomp($line);
# print "$line\n";
print "\t <div>          |   -- " . $line . "</div>\n";
}
close DATA;
S'il vous plaît aussi ne pas hésiter à corriger tout code ici, voici mon premier poème de Perl.
Merci!
La solution
Vous pouvez toujours utiliser $.
ou le nom anglais $INPUT_LINE_NUMBER
pour contrôler la logique dans votre boucle avec:
while (my $line = <>) {
if ($. == 1) {
# do cool stuff here
}
# do normal stuff here
}
Autres conseils
Pour gérer la première ligne différemment, vous pouvez simplement mettre
$line = <DATA>;
au dessus de votre boucle.
Avec une vérification correcte des problèmes de lecture (fichier vide, etc.) cela devrait être
if ($line = <DATA>) {
...do special things...
}
while (my $line = <DATA>) {
...do regular things...
}
Je ne suis pas sûr de l'appel defined()
. Vous ne pourriez pas besoin, car une chaîne vide a une valeur fausse vérité.
Du point de vue des « meilleures pratiques » il y a beaucoup de mal avec cet exemple de code:
open DATA, $command_string or die "Couldn't execute program: $!";
- trou de sécurité, s'il vous plaît me exploiter.
- DATA est une valeur magique qui pointe vers une section de
__DATA__
à la fin du fichier courant. -
Vous devez utiliser
open my $fh
Ce qui utilise une variable lexicale pour une poignée de fichier au lieu d'une approche globale.
-
Vous devez utiliser 3 arg ouverte, à savoir:
open my $fh, '<' , $filename open my $fh, '-|' , $command open my $fh, '-|' , $command, @args
malheureusement je dois encore travailler comment 3-arg fonctionne avec deux tuyaux. Theres' cette chose IPC :: Open2, mais je ne l'ai pas travaillé sur la façon à l'utiliser encore efficacement. Suggestions de bienvenue.