Chinaunix
标题:
请教一个关于hash的问题
[打印本页]
作者:
Ammon
时间:
2011-11-18 13:32
标题:
请教一个关于hash的问题
有这样的一个数据结构:
grp "hardware" {
12/24;
13/25;
14/26;
};
grp "software" {
15/27;
16/28;
17/29;
};
想以"hardware""software"作为key值,然后对应的{安装数量/总数量}里面的"安装数量"作为values值.
尝试过把\r\n 替换掉合并成一行再使用正则匹配,但好像在多个{}情况下,很难匹配到.
所以请教下这个结构 怎么匹配成hash方式呢?
作者:
kk861123
时间:
2011-11-18 14:13
回复
1#
Ammon
按你要求,写了一个
#!/usr/bin/perl
use strict;
use warnings;
my %hash;
my $key;
while (<DATA>) {
if (/grp \"(\w+)\" \{/) {
$key = $1;
next;
}
if (/\};/) {
undef $key;
}
if ($key) {
push @{ $hash{$key} },(split /\//,$_)[0];
}
}
use Data::Dumper;
print Dumper \%hash;
__DATA__
grp "hardware" {
12/24;
13/25;
14/26;
};
grp "software" {
15/27;
16/28;
17/29;
};
复制代码
作者:
Ammon
时间:
2011-11-18 14:21
本帖最后由 Ammon 于 2011-11-18 14:25 编辑
谢谢了 代码很简洁 完全符合需求
可以帮忙再解释下
push @{ $hash{$key} },(split /\//,$_)[0];
这个[0] 是什么意思吗?
作者:
kk861123
时间:
2011-11-18 14:41
回复
3#
Ammon
split后数组的第一个元素,就是你要的‘安装数量’:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $line = '12/24;';
my @data = split /\//,$line;
print Dumper \@data;
复制代码
作者:
yinyuemi
时间:
2011-11-18 14:47
本帖最后由 yinyuemi 于 2011-11-18 14:55 编辑
回复
1#
Ammon
echo 'grp "hardware" {
12/24;
13/25;
14/26;
};
grp "software" {
15/27;
16/28;
17/29;
};' |\
perl -MData::Dumper -le 'while(<>){
if(/{/)
{$key=(split /"/)[1];}
elsif(/[0-9];$/)
{$value.=(split /\/|;/)[1]."\n"}
else
{$hash{$key}=$value;$key=$value=""}
}
END{print Dumper \%hash}
'
$VAR1 = {
'software' => '27
28
29
',
'hardware' => '24
25
26
'
};
复制代码
作者:
kk861123
时间:
2011-11-18 15:10
回复
1#
Ammon
刚才一直没想起来范围操作符的使用方式,这样也比较好懂:
#!/usr/bin/perl
use strict;
use warnings;
my %hash;
my $key;
while (<DATA>) {
if (/grp \"(\w+)\" \{/../\};/) {
$key = $1;
if (/(\d+)\/\d+/) {
push @{$hash{$key}},$1;
}
}
}
use Data::Dumper;
print Dumper \%hash;
__DATA__
grp "hardware" {
12/24;
13/25;
14/26;
};
grp "software" {
15/27;
16/28;
17/29;
};
复制代码
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2