变量包含perl中的句点,但我不想连续

时间:2015-07-07 15:45:58

标签: perl hash

我正在尝试从表格数据创建哈希。其中一列包含由。分隔的团队名称 - 例如USA.APP.L2PES。

将被拆分的样本行(|是分隔符):

http://10.x.x.x:8085/BINReport/servlet/Processing|2012/10/02 08:40:30|2015/03/10 16:00:42|nxcvapxxx_bin|Chandler|Linkpoint Connect|USA.APP.L2PES

这是我用来拆分和排列成哈希的代码(在另一个堆栈交换评论中找到)。

my @records;
while (<$fh_OMDB>) {
    my @fields = split /\s*\|\s*/, $_;
    my %hash;
    @hash{@headers} = @fields;
    push @records, \%hash;
}
for my $record (@records) {
    my $var = $record->{Arg04};
    print $var;
}

但是,每当我尝试打印$ var时,都会收到错误消息

  

在find_teams_v2.pl第53行打印时使用未初始化的值$ var,    第2667行。

我相信这是因为字符串包含一个。并且perl正在尝试连接值。如何将字符串打印为文字?

这是数据转储器的输出(只有其中一个,因为有几千个输出):

$VAR1 = {
      'Arg01' => 'zionscatfdecs',
      'Date Added' => '2013/08/06 10:30:04',
      'URL' => 'https://zionscat.fdecs.com',
      'Arg04
' => 'USA.FDFI.APP.TMECS2
',
      'Date Updated' => '2013/08/06 10:30:04',
      'Arg02' => 'Omaha',
      'Arg03' => 'First Data eCustomer Service ()'
    };

标题转储:

$VAR1 = 'URL';
$VAR2 = 'Date Added';
$VAR3 = 'Date Updated';
$VAR4 = 'Arg01';
$VAR5 = 'Arg02';
$VAR6 = 'Arg03';
$VAR7 = 'Arg04
';

2 个答案:

答案 0 :(得分:2)

嘲笑我自己的@headers它似乎工作正常。

#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;

my @headers = qw ( mee mah mo mum
                   fee fi fo fum );

my $string =
    q{http://10.x.x.x:8085/BINReport/servlet/Processing|2012/10/02 08:40:30|2015/03/10 16:00:42|nxcvapxxx_bin|Chandler|Linkpoint Connect|USA.APP.L2PES};

my @records;
my @fields = split /\s*\|\s*/, $string;
print join( "\n", @fields );
my %hash;
@hash{@headers} = @fields;
print Dumper \%hash;
push @records, \%hash;

foreach my $record (@records) {
    my $var = $record ->{fo};
    print $var,"\n";
}

按照预期打印字符串 - 带点。这是因为哈希看起来像每个循环(使用您的样本数据):

$VAR1 = {
          'fi' => 'Linkpoint Connect',
          'mo' => '2015/03/10 16:00:42',
          'mum' => 'nxcvapxxx_bin',
          'mee' => 'http://10.x.x.x:8085/BINReport/servlet/Processing',
          'mah' => '2012/10/02 08:40:30',
          'fee' => 'Chandler',
          'fum' => undef,
          'fo' => 'USA.APP.L2PES'
        };

但是,如果我的标题是&#39;行更短:

my @headers = qw ( mee mah mo mum );

我可以重现你的错误:

Use of uninitialized value $var in print

那是因为没有{fo}元素:

$VAR1 = {
          'mo' => '2015/03/10 16:00:42',
          'mee' => 'http://10.x.x.x:8085/BINReport/servlet/Processing',
          'mum' => 'nxcvapxxx_bin',
          'mah' => '2012/10/02 08:40:30'
        };

所以:

  • 确保您已启用strictwarnings
  • 检查@headers已宣布。
  • check @headers实际上足以匹配每个字段。

运行:

use Data::Dumper;
print Dumper \@headers;

会告诉你这个。

如上述评论中所述:

      'Arg04
' => 'USA.FDFI.APP.TMECS2

{Arg04}不存在,我们有换行符。在将其转换为标题之前chomp您的行(或仅chomp @headers),您的代码将起作用。

注意 - 您可能还希望在while循环中chomp,否则最后一个字段包含换行符。 (这可能是不受欢迎的)

答案 1 :(得分:2)

使用Data::Dumper打印输出显示我的标题字段数少于现有标题字段,因此当我调用Arg04时,它不存在或引用undef领域。在标头数组上执行chomp修复了错误消息。