【问题标题】:perl array prints as GLOB(#x#########)perl 数组打印为 GLOB(#x#########)
【发布时间】:2019-01-30 19:39:26
【问题描述】:

我有一个文件,其中包含一个由分号分隔的电子邮件地址列表,其配置非常像这样(但更大):

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

但是文件给了我一个golb。我只是不知道发生了什么。

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

如果我使用 Data::Dumper 我会得到 ​​p>

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

【问题讨论】:

    标签: perl split


    【解决方案1】:

    您不会“将整个文件吸入数组”。您甚至不会尝试从文件句柄中读取。相反,您将文件句柄传递给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*/, $_;
    }
    

    【讨论】:

      【解决方案2】:

      这一行

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

      没有像你想象的那样从文件句柄中读取。您实际上是在文件句柄对象本身上调用split

      你想要这个:

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

      【讨论】:

      • 仅带错误检查;照原样,如果没有要读取的行会发出警告
      【解决方案3】:

      起点:

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

      【讨论】:

        猜你喜欢
        • 2012-07-22
        • 1970-01-01
        • 1970-01-01
        • 2019-01-07
        • 1970-01-01
        • 2016-07-11
        • 2011-03-12
        • 2011-03-02
        • 1970-01-01
        相关资源
        最近更新 更多