让我们首先将数据导入 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
match car
和busi_db
matches 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
子程序。您弄清楚是什么使两个单独的键匹配,并填写详细信息。
顺便说一句,根据您的示例数据,空成员位于非空成员之后。如果这始终为真条件,则无需将读取循环与合并循环分开。不幸的是,你没有说这是否属实。
你也没有指定我是否必须按照读取的顺序打印数组。我可以保留一个键列表,并按顺序排列它们。我没有,因为它会使逻辑复杂化,你没有指定它。
请注意您的问题的低排名,以及人们将其标记为关闭的事实。这是因为您基本上说:“我有这个问题,为我解决它”。您也没有为解决方案提供足够的详细信息。正如我所说,您谈到了匹配键,但没有具体说明您的意思。