我有一些数据应该可以很容易地分成哈希。
以下代码旨在将字符串拆分为相应的键/值对,并将输出存储在散列中。
代码:
use Data::Dumper;
# create a test string
my $string = "thing1:data1thing2:data2thing3:data3";
# Doesn't split properly into a hash
my %hash = split m{(thing.):}, $string;
print Dumper(\%hash);
然而,在检查输出时,很明显该代码不能按预期工作。
输出:
$VAR1 = {
'data3' => undef,
'' => 'thing1',
'data2' => 'thing3',
'data1' => 'thing2'
};
为了进一步研究这个问题,我将输出分成一个数组,然后打印结果。
代码:
# There is an extra blank element at the start of the array
my @data = split m{(thing.):}, $string;
for my $line (@data) {
print "LINE: $line\n";
}
输出:
LINE:
LINE: thing1
LINE: data1
LINE: thing2
LINE: data2
LINE: thing3
LINE: data3
正如您所看到的,问题是split
在数组的开头返回了一个额外的空元素。
有什么方法可以将分割输出中的第一个元素丢弃并将其存储在一行的哈希值中?
我知道我可以将输出存储在一个数组中,然后只需移开第一个值并将数组存储在哈希中......但我只是好奇这是否可以在一步。
答案 0 :(得分:5)
my (undef, %hash) = split m{(thing.):}, $string;
将丢弃第一个值。
答案 1 :(得分:4)
我建议使用regex
而不是split
:
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my $string = "thing1:data1thing2:data2thing3:data3";
my %results = $string =~ m/(thing\d+):([A-Z]+\d+)/ig;
print Dumper \%results;
当然,这确实假设你匹配'word + digit'组,因为没有那个“数字”分隔符它也不会起作用。 我的目标是主要说明这种技术 - 从字符串中获取'配对'值,因为它们直接分配给哈希。
正则表达式可能需要更复杂一些,例如nongreedy量词:
my %results = $string =~ m/(thing.):(\w+?)(?=thing|$)/ig;
这可能会使其在清晰度方面贬值。