Language agnostic 分析行并选择与键对应的值
有一组数据以特定方式排列(如树),如下所示。基本上是一个key=value对,末尾有一些附加值,通知分支有多少子级和一些垃圾值Language agnostic 分析行并选择与键对应的值,language-agnostic,parsing,data-structures,tree,Language Agnostic,Parsing,Data Structures,Tree,有一组数据以特定方式排列(如树),如下所示。基本上是一个key=value对,末尾有一些附加值,通知分支有多少子级和一些垃圾值 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 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
对于上述给定的键->值列表,函数应返回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=01作为匹配项。不是最后一行;因为这也将匹配输入键中给定的所有值,但是,我只希望精确匹配
另外,我想知道在给定的数组中选择了多少个节点。(以>)分隔)
实现这种场景的最佳方式是什么 使用严格;
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
使用警告;
我的美元树;
而(){
我的@data=split/\>/,(/^([^]*)/)[0];
my$ptr=\$tree;
对于我的$key(@data){
$ptr=\$$ptr->{$key};
}
}
我的@inputs=(
[qw(5=04=06=103=1111=111=450=1389=162=347=080)],
[qw(5=04=06=103=1111=111=459=162=347=080]
);
子密钥{
我的($lu,$node)=@;
存在$lu->{$\}并返回$\$键%$节点;
}
对于我的$input(@inputs){
我的%lu;
@lu{@$input}=();
我的结果;
我的$node=$tree;
而(%lu){
my$key=getKey(\%lu,$node);
如果($key){
$node=$node->{$key};
按@result$key;
删除$lu{$key};
}
否则{
最后;
}
}
打印联接('>',@result),“\n”;
}
__资料__
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
请您扩展一下输入格式好吗?您的问题是将输入行的子集与树根中的路由相匹配吗?此外,由于您的输入包含1=45,而最后一行仅包含1=47,因此树中的最后一行如何匹配第二个键中的所有值?此外,您的“树”是否总是与本例中相同?仅根的两个子元素不同,而两个子树之间的所有其他值相同?也许可以利用这个属性得到一个更有效的算法。@sundar:我上面给出的只是一个树的例子。有许多其他的方法可以形成树,是的,问题是如何将树的子集与输入中给出的内容相匹配。