有一组数据以特定方式(如树)排列,如下所示。基本上是一个键=值对,最后有一些额外的值,通知分支有多少个孩子和一些垃圾值。
11=1 123 2
11=1>1=45 234 1
11=1>1=45>9=16 345 1
11=1>1=45>9=16>2=34 222 1
11=1>1=45>9=16>2=34>7=0 2234 1
11=1>1=45>9=16>2=34>7=0>8=0 22345 1
11=1>1=45>9=16>2=34>7=0>8=0>0=138 22234 1
11=1>1=45>9=16>2=34>7=0>8=0>0=138>5=0 5566 1
11=1>1=45>9=16>2=34>7=0>8=0>0=138>5=0>4=0 664 1
11=1>1=45>9=16>2=34>7=0>8=0>0=138>5=0>4=0>6=10 443 1
11=1>1=45>9=16>2=34>7=0>8=0>0=138>5=0>4=0>6=10>3=11 445 0
11=1>1=47 4453 1
11=1>1=47>9=16 887 1
11=1>1=47>9=16>2=34 67 1
11=1>1=47>9=16>2=340>7=0 98 1
11=1>1=47>9=16>2=34>7=0>8=0 654 1
11=1>1=47>9=16>2=34>7=0>8=0>0=138 5789 1
11=1>1=47>9=16>2=34>7=0>8=0>0=138>5=0 9870 1
11=1>1=47>9=16>2=34>7=0>8=0>0=138>5=0>4=0 3216 1
11=1>1=47>9=16>2=34>7=0>8=0>0=138>5=0>4=0>6=10>3=11 66678 0
我的问题是从上面的数据中获取适当的分支,它完全满足我给出的值作为输入。 假设,我在上述数据堆栈中搜索的输入值是:
5=0
4=0
6=10
3=11
11=1
1=45
0=138
9=16
2=34
7=0
8=0
对于上面给出的key->值列表,该函数应该返回11 = 1> 1 = 45> 9 = 16> 2 = 34> 7 = 0> 8 = 0> 0 = 138> 5 = 0> ; 4 = 0> 6 = 10> 3 = 11作为匹配。 同样,对于另一个输入文件,其中给出了另一组键:
5=0
4=0
6=10
3=11
11=1
1=45
9=16
2=34
7=0
8=0
该函数应该返回11 = 1> 1 = 45> 9 = 16> 2 = 34> 7 = 0> 8 = 0 1作为匹配。不是最后一行;因为这也会匹配我的输入键中给出的所有值,但是,我只想要完全匹配。
另外,我想知道给定数组中选择了多少个节点。 (以>分隔)。
实施此类方案的最佳方式是什么?
答案 0 :(得分:1)
use strict;
use warnings;
my $tree;
while (<DATA>) {
my @data = split /\>/, (/^([^ ]*)/)[0];
my $ptr = \$tree;
for my $key (@data) {
$ptr = \$$ptr->{$key};
}
}
my @inputs = (
[qw(5=0 4=0 6=10 3=11 11=1 1=45 0=138 9=16 2=34 7=0 8=0)],
[qw(5=0 4=0 6=10 3=11 11=1 1=45 9=16 2=34 7=0 8=0)]
);
sub getKey {
my ( $lu, $node ) = @_;
exists $lu->{$_} and return $_ for keys %$node;
}
for my $input (@inputs) {
my %lu;
@lu{@$input} = ();
my @result;
my $node = $tree;
while (%lu) {
my $key = getKey( \%lu, $node );
if ($key) {
$node = $node->{$key};
push @result, $key;
delete $lu{$key};
}
else {
last;
}
}
print join( '>', @result ), "\n";
}
__DATA__
11=1 123 2
11=1>1=45 234 1
11=1>1=45>9=16 345 1
11=1>1=45>9=16>2=34 222 1
11=1>1=45>9=16>2=34>7=0 2234 1
11=1>1=45>9=16>2=34>7=0>8=0 22345 1
11=1>1=45>9=16>2=34>7=0>8=0>0=138 22234 1
11=1>1=45>9=16>2=34>7=0>8=0>0=138>5=0 5566 1
11=1>1=45>9=16>2=34>7=0>8=0>0=138>5=0>4=0 664 1
11=1>1=45>9=16>2=34>7=0>8=0>0=138>5=0>4=0>6=10 443 1
11=1>1=45>9=16>2=34>7=0>8=0>0=138>5=0>4=0>6=10>3=11 445 0
11=1>1=47 4453 1
11=1>1=47>9=16 887 1
11=1>1=47>9=16>2=34 67 1
11=1>1=47>9=16>2=340>7=0 98 1
11=1>1=47>9=16>2=34>7=0>8=0 654 1
11=1>1=47>9=16>2=34>7=0>8=0>0=138 5789 1
11=1>1=47>9=16>2=34>7=0>8=0>0=138>5=0 9870 1
11=1>1=47>9=16>2=34>7=0>8=0>0=138>5=0>4=0 3216 1
11=1>1=47>9=16>2=34>7=0>8=0>0=138>5=0>4=0>6=10>3=11 66678 0