让我们首先将数据进入的Perl。您将打开文件,并将其读入第一个空格的散列分割。我不在乎a
,b
,c
,或d
拆分成单独的数据,因为它使得在程序中并无区别:
use strict;
use warnings;
use autodie;
open INPUT, "<", "TEST.txt";
my %array;
while my $line (<INPUT>) {
chomp $line;
my ($key, $data) = split /\s+/, $line, 2;
$array{$key} = $value;
}
这将为我们提供以下内容:
$array{car} = "1 2 0 7";
$array{tram} = "7 8 9 5";
$array{bus_db} = "1 6 3 8";
$array{cari} = "";
$array{busi_db} = "";
现在,东西你还没有解释:你如何知道空数组成员匹配非空的数组成员。我如何知道cari
匹配car
和busi_db
匹配bus_db
?是否将i
追加到最后,但在可能的db
后缀之前?他们的其他事情我们应该知道吗?
一旦你看着办吧,让他们匹配是非常简单的:
$array{busi_db} = $array{bus_db};
然后,它打印出来的一件简单的事情。
# Go through array and make "null" members match
while my $key (sort keys %array) {
if (not $array{$key}) { #Ah! a null array member!
$matching_key = find_matching_key($key);
$array{$key} = $array{$matching_key};
}
}
# Print them out
while my $key (sort keys %array) {
print "$key = $array{$key}\n";
}
sub find_matching_key {
# Here be dragons....
}
问题是find_matching_key
子程序。你找出两个单独的键匹配的内容,并填写详细信息。
顺便说一下,根据您的示例数据,空成员来到非空元素之后。如果这总是一个真实的条件,则不需要将读取循环与合并循环分开。不幸的是,你没有说这是否是真的。
也没有,你是否指定我是否必须按照读入的顺序打印数组。我可以保存一个键列表,并保持它们的顺序。我没有,因为它会使逻辑复杂化,而你没有指定它。
请注意您的问题的排名较低,以及人们将其标记为关闭的事实。这是因为你基本上说:“我有这个问题,为我解决”。您也没有提供足够的解决方案细节。正如我所说,你谈到匹配键,但没有具体说明你的意思。
[你有什么尝试?](http://whathaveyoutried.com) – Leri 2012-08-17 09:22:34
在第一个“_”之前总会有“i”,如果没有“_”?可以用文字解释你的搜索模式吗? – tuxtimo 2012-08-17 09:32:49
@ tuxtimo:是的,他们将永远是“我”与没有价值的钥匙附加。所以我想要随着价值一起出现的钥匙一起搜索我。 – unkaitha 2012-08-17 09:37:48