我试图从表格数据创建一个哈希 . 其中一列包含由 . 分隔的团队名称 - 例如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 回答
嘲笑我自己
@headers
似乎工作正常 .这将按照预期打印字符串 - 带点 . 这是因为哈希看起来像每个循环(使用您的示例数据):
但是,如果我的' Headers '行更短:
我可以重现你的错误:
那个's because there' s没有
{fo}
元素:所以:
确保您已打开
strict
和warnings
.声明了
check
@headers
.check
@headers
实际上足以匹配每个字段 .运行:
会告诉你这个 .
如上面的评论中所述:
{Arg04}
不存在,我们有换行符 .chomp
您的行在将其转换为 Headers 之前(或只是chomp @headers
)并且您的代码将起作用 .注意 - 您可能还希望在while循环中使用
chomp
,否则最后一个字段也将包含换行符 . (这可能是不受欢迎的)使用
Data::Dumper
打印输出显示我的 Headers 字段少于现有 Headers 字段,因此当我调用Arg04
时,它不存在或者引用了undef
字段 . 在标头数组上执行chomp
修复了错误消息 .