我正在尝试从表格数据创建哈希。其中一列包含由。分隔的团队名称 - 例如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
';
答案 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'
};
所以:
strict
和warnings
。@headers
已宣布。@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
修复了错误消息。