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) {
...
}