J'ai un fichier qui contient une liste d'adresses e-mail qui sont séparées par un point-virgule qui est configuré comme ceci (mais beaucoup plus grand):
$ ./spliton_semi.pl email_casper.txt $VAR1 = [ 'GLOB(0x80070b90)' ];
Je veux le casser sur le point-virgule - donc je suce le fichier entier dans un tableau supposé que le contenu est divisé en point-virgule.
#!/usr/bin/perl use strict; use warnings; use Data::Dumper ; my $filename = shift @ARGV ; open(my $fh, '<', $filename) or die "Could not open file $filename $!"; my @values = split(';', $fh); print Dumper \@values ;
Mais le fichier me récompense avec un golb. Je ne sais tout simplement pas ce qui se passe.
$ ./spliton_semi.pl email_casper.txt GLOB(0x80070b90)
Si j'utilise Data :: Dumper, j'obtiens
#!/usr/bin/perl use strict; use warnings; my $filename = shift @ARGV ; open(my $fh, '<', $filename) or die "Could not open file $filename $!"; my @values = split(';', $fh); foreach my $val (@values) { print "$val\n"; } exit 0 ;
Voici ce que le Dumper renvoie:
$ cat email_casper.txt casper1@foo.com; casper2@foo.com; casper3@foo.com; casper.casper4@foo.com; #these throw outlook error : #casper101@foo.com ; casper100@foo.com #cat /tmp/emailist.txt | tr '\n' '; ' #cat /tmp/emallist.txt | perl -nle 'print /\<(.*)\>/' | sort
3 Réponses :
Point de départ:
$ perl dummy.pl casper1@foo.com casper2@foo.com casper3@foo.com casper.casper4@foo.com
Résultat de votre exemple:
#!/usr/bin/perl use strict; use warnings; open(my $fh, '<', 'dummy.txt') or die "$!"; my @values; while (<$fh>) { chomp; # original # push(@values, split(';', $_)); # handle white space push(@values, split(/\s*;\s*/, $_)); } close($fh); foreach my $val (@values) { print "$val\n"; } exit 0;
Cette ligne
my $line = <$fh>; my @values = split(';', $line);
ne lit pas le descripteur de fichier comme vous le pensez. Vous appelez en fait split
sur l'objet filehandle lui-même.
Vous voulez ceci:
my @values = split(';', $fh);
uniquement avec vérification des erreurs; tel quel, cela donnera un avertissement s'il n'y avait pas de ligne à lire
Vous n'aspirez pas le fichier entier dans un tableau. Vous n'essayez même pas de lire à partir du descripteur de fichier. Au lieu de cela, vous passez le descripteur de fichier à split
. En attendant une chaîne, il stringifie le descripteur de fichier dans GLOB (0x80070b90)
.
Vous pouvez lire le fichier dans un tableau de lignes comme suit:
#!/usr/bin/perl use strict; use warnings; use feature qw( say ); while (<>) { chomp; say for split /\s*;\s*/, $_; }
Mais il est beaucoup plus simple de lire une ligne à la fois.
while ( my $line = <$fh> ) { ... }
En fait, il n'y a aucune raison de ne pas utiliser ARGV
ici, en simplifiant votre programme comme suit:
my @lines = <$fh>; for my $line ($lines) { ... }