Массив perl печатается как GLOB (#x #########) - PullRequest
0 голосов
/ 30 января 2019

У меня есть файл, содержащий список адресов электронной почты, разделенных точкой с запятой, который настроен примерно так (но гораздо больше):

$ 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

Я хочу разбить его наточка с запятой - так что я засасываю весь файл в массив, предположительно содержимое разбито на точку с запятой.

#!/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 ;

Но файл награждает меня золотым смехом.Я просто не знаю, что происходит.

$ ./spliton_semi.pl email_casper.txt
GLOB(0x80070b90)

Если я использую Data :: Dumper, я получаю

#!/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 ;

Вот что возвращает Dumper:

$ ./spliton_semi.pl email_casper.txt
$VAR1 = [
          'GLOB(0x80070b90)'
        ];

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Эта строка

my @values = split(';', $fh);

не читает из файлового дескриптора, как вы думаете.Вы фактически вызываете split для самого объекта дескриптора файла.

Вы хотите это:

my $line = <$fh>;
my @values = split(';', $line);
0 голосов
/ 31 января 2019

Вы не «всасываете весь файл в массив».Вы даже не пытаетесь читать из дескриптора файла.Вместо этого вы передаете дескриптор файла на split.Ожидая строку, она переводит дескриптор файла в GLOB(0x80070b90).

. Вы можете прочитать файл в массив строк следующим образом:

my @lines = <$fh>;
for my $line ($lines) {
   ...
}

Но гораздо проще прочитать одну строкуза один раз.

while ( my $line = <$fh> ) {
   ...
}

На самом деле, нет причин не использовать здесь ARGV, упрощая вашу программу следующим образом:

#!/usr/bin/perl

use strict;
use warnings;
use feature qw( say );

while (<>) {
   chomp;
   say for split /\s*;\s*/, $_;
}
0 голосов
/ 30 января 2019

Начальная точка:

#!/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;

Вывод для вашего примера:

$ perl dummy.pl
casper1@foo.com
casper2@foo.com
casper3@foo.com
casper.casper4@foo.com
...