2 votes

Perl: Ajouter une exception à une boucle foreach

Je suis nouveau sur Stack Overflow et j'aimerais demander quelques conseils concernant un petit problème que j'ai avec mon code Perl. En bref, j'ai écrit un petit programme qui ouvre des fichiers texte à partir d'un tableau prédéfini, puis recherche certaines chaînes de caractères en eux et finalement affiche la ligne contenant la chaîne.

my @S1A_SING_Files = (
    'S1A-001_SING_annotated.txt', 
    'S1A-002_SING_annotated.txt',
    'S1A-003_SING_annotated.txt', 
    'S1A-004_SING_annotated.txt',
    'S1A-005_SING_annotated.txt'
    );

foreach (@S1A_SING_Files) {
    print ("\n");
    print ("Résultats de recherche pour $_:\n\n");   
    open (F, $_) or die("Impossible d'ouvrir le fichier!\n");

        while ($line = ) {
        if ($line =~ /\$(voc)?[R|L]D|\$Rep|\/\//) {
        print ($line);

        }
    }
}

close (F);

Je me demandais s'il serait possible de créer une exception à la boucle foreach, de sorte que la ligne contenant

print ("\n");

ne soit pas exécutée si le fichier est $S1A_SING_Files[0]. Elle devrait ensuite être exécutée normalement si le fichier est l'un des suivants. Pensez-vous que cela pourrait être accompli ?

Merci beaucoup d'avance !

1voto

toolic Points 23449

Oui. Il suffit d'ajouter une vérification pour le premier fichier. Changer :

print ("\n");

à :

print ("\n") if $_ ne $S1A_SING_Files[0];

1voto

ikegami Points 133140

Si le tableau contient des chaînes uniques, vous pouvez utiliser ce qui suit:

print("\n") if $_ ne $S1A_SING_Files[0];     # Différente chaine de caractères que le 1er élément?

Le suivant fonctionnera même si le tableau contient des valeurs non-chaînes ou des doublons (et c'est aussi plus rapide):

print("\n") if \$_ != \$S1A_SING_Files[0];   # Scalaire différent du 1er élément?

Les deux exemples ci-dessus pourraient échouer pour les tableaux magiques. La solution la plus fiable est d'itérer sur les indexes.

for my $i (0..$#S1A_SING_Files) {
   my $file = $S1A_SING_Files[$i];

   print("\n") if $i;                        # Index différent du 1er élément?

   ...
}

-1voto

Polar Bear Points 4537

Votre code peut être écrit sous la forme suivante

use strict;
use warnings;

my @S1A_SING_Files = (
    'S1A-001_SING_annotated.txt', 
    'S1A-002_SING_annotated.txt',
    'S1A-003_SING_annotated.txt', 
    'S1A-004_SING_annotated.txt',
    'S1A-005_SING_annotated.txt'
    );

foreach (@S1A_SING_Files) {
    print "\n" unless $_ ne $S1A_SING_Files[0];
    print "Résultats de la recherche pour $_:\n\n";
    open my $fh, '<', $_ or die("Impossible d'ouvrir le fichier!\n");
    m!\$(voc)?[R|L]D|\$Rep|//! && print while <$fh>;
    close $fh;
}

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