我有两个文件
**a.txt**
cars
bikes
bus
vehicle
atv
**b.txt**
hawk
hero
atv
bus
***result.txt***
cars
bikes
vehicle
hawk
hero
我想打印两个文件之间的差异。现在我已经尝试了一个代码,但它以随机的方式给了我不同之处;我希望它以正确的顺序方式显示它。谁能帮我解决这个问题。
use strict;
my %results = ();
open FILE1, "<a.txt"
or die "Could not open file: $! \n";
while (my $line = <FILE1>) {
$results{$line}=1;
}
close FILE1;
open FILE2, "<b.txt"
or die "Could not open file: $! \n";
while (my $line = <FILE2>) {
$results{$line}++;
}
close FILE2;
open OUTFILE, ">>result.txt"
or die "Cannot open $outfile for writing \n";
foreach my $line (keys %results) {
print OUTFILE $line if $results{$line} == 1;
}
close OUTFILE;
close OUTFILE1;
我用这段代码得到的输出是
***result.txt***
cars
hawk
bikes
hero
vehicle
最佳答案
哈希以随机顺序存储它们的元素,因此我们必须随身携带位置信息。在下面的解决方案中,我使用哈希值来携带一个唯一的 ID。
代码
#!/usr/bin/perl
use strict; use warnings; use Data::Dumper;
my @a = qw( cars bikes bus vehicle atv );
my @b = qw( hawk hero atv bus );
my $i = 0;
my %ahash = map {$_ => ++$i} @a;
my %bhash = map {$_ => ++$i} @b;
my %different = map {
($ahash{$_} and $bhash{$_})
? ()
: ($_ => ($ahash{$_} or $bhash{$_}))
} (keys %ahash, keys %bhash);
my @sorted = sort {$different{$a} <=> $different{$b}} keys %different;
print Dumper(\@sorted);
讨论
为了演示,我没有使用文件,而是将记录存储在数组@a
和@b
中。
我从这些数组构建散列 %ahash
和 %bhash
,使用数组元素作为键并使用唯一数字作为值。对于 %ahash
,这些 ID 与行号相同。您可以将 %bhash
中的 ID 视为带有偏移量的行号。
然后我收集哈希之间不同的所有键值对。为此,我获取了 %ahash
和 %bhash
中所有键的列表。对于这些键中的每一个,我在两个哈希中测试该键是否存在(我不使用 exists
,而是针对值进行测试,因为我可以保证没有 ID 具有错误值被赋值——除 0
之外的所有数字都计算为真)。如果 key 存在于两个散列中,我将返回空列表 ()
。如果键仅存在于其中一个哈希中,我将返回一个包含键和值的双元素列表,该列表位于 %ahash
或 %bhash
中。
在下一步中,我根据关联值对所有不同的键进行升序排序,并将键按此顺序存储在 @sorted
中。您可以将它们打印到文件中,我只是将它们转储,并得到以下输出:
$VAR1 = [
'cars',
'bikes',
'vehicle',
'hawk',
'hero'
];
我相信这符合您的标准。
基本上,您有一个非常优雅的算法来查找差异,但您没有合并排序数据,就像我对行号(如 ID)所做的那样。
样式注释
在大多数情况下,使用 my
的词法文件句柄优于使用全局文件句柄。此外,open
的三参数形式更灵活,值得习惯。例如,我会把你的第三行写成
my $filename1 = "a.txt";
open my $file1, '<', $filename1 or die qq{Could not open "$filename1": $!\n};
不过话说回来,TIM TOWTDI。
关于regex - 比较两个文件并按顺序打印它们之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12470017/