1
votes

Le tableau perl s'imprime comme GLOB (#x #########)

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


0 commentaires

3 Réponses :


0
votes

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;


0 commentaires

2
votes

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);


1 commentaires

uniquement avec vérification des erreurs; tel quel, cela donnera un avertissement s'il n'y avait pas de ligne à lire



3
votes

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


0 commentaires