首页 文章

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

提问于
浏览
0

我试图从表格数据创建一个哈希 . 其中一列包含由 . 分隔的团队名称 - 例如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行第2667行使用未初始化的值$ var .

我相信这是因为字符串包含一个 . 并且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 回答

  • 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'
            };
    

    但是,如果我的' Headers '行更短:

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

    我可以重现你的错误:

    Use of uninitialized value $var in print
    

    那个's because there' s没有 {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 .
      声明了

    • check @headers .

    • check @headers 实际上足以匹配每个字段 .

    运行:

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

    会告诉你这个 .

    如上面的评论中所述:

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

    {Arg04} 不存在,我们有换行符 . chomp 您的行在将其转换为 Headers 之前(或只是 chomp @headers )并且您的代码将起作用 .

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

  • 2

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

相关问题