Votre deuxième ligne a plus d'un espace entre le groupe de nombres et la lettre, donc vous voulez probablement \s+
deux fois plutôt que \s
la deuxième fois. À la fin, vous ne saurez pas nécessairement combien d'éléments vous avez dans le tableau @value
, alors vous voudrez peut-être mettre l'impression dans une boucle for
plutôt que de supposer que vous avez un cinquième élément. (Peut-être savez-vous que vous voulez le premier et le cinquième, cependant?) Suivi: basé sur votre édition, vous avez plus de deux entrées après tout. La version que je donne ci-dessous, en utilisant split
et \s+
capture le nombre et la lettre pour toutes les lignes. Je vais ajuster la partie imprimée du script pour vous montrer ce que je veux dire.
Quelques autres:
- Vous devez toujours activer les avertissements.
- Il n'y a aucune raison de lire tout le fichier dans un tableau et de le parcourir ligne par ligne. Passer le tableau
@body
et faire ce que vous devez dans la boucle while
.
- Utilisez la forme plus moderne de
open
avec des handles de fichiers lexicaux et trois arguments.
split
semble plus simple ici pour moi, plutôt que d'une expression régulière avec des captures. Puisque vous voulez capturer deux parties spécifiques de la ligne, vous pouvez utiliser split
avec une tranche de tableau pour saisir ces deux éléments et les envoyer à join
.
@value
n'est pas un nom de variable particulièrement utile, mais je pense que vous devriez au moins le rendre pluriel. Je pense que c'est une bonne habitude d'entrer dans la mesure où le tableau stocke vos enregistrements pluriels. (.. Ce n'est pas une règle stricte et rapide, mais il me mis sur écoute ici Ce point est assez mineur)
Voilà comment tout cela pourrait ressembler:
#!/usr/bin/env perl
use warnings;
use strict;
my @values;
# open my $filehandle, '<', '/usr/test'
# or die "Can't open /usr/test: $!";
while (my $line = <DATA>) {
chomp $line;
push @values, join('', (split /\s+/, $line)[1..2]);
}
for my $record (@values) {
print $record, "\n";
}
__DATA__
1389 E not
188 S yes
24 D yes
456 K not
2 Q yes
@ David: J'ai écrit @value [0] par erreur. J'utilise $ value [0] pour imprimer la première valeur du tableau. Et, aucune valeur ne s'imprime pour le premier élément, c'est-à-dire $ value [0] – shubster