chi*_*und 2 regex perl compare
我有2个文件
**a.txt**
cars
bikes
bus
vehicle
atv
**b.txt**
hawk
hero
atv
bus
***result.txt***
cars
bikes
vehicle
hawk
hero
Run Code Online (Sandbox Code Playgroud)
我想打印2个文件之间的差异.现在我尝试了一个代码,但它以随机的方式给了我差异; 我希望它以适当的顺序方式显示它.任何人都可以帮助我.
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;
Run Code Online (Sandbox Code Playgroud)
我使用此代码获得的输出是
***result.txt***
cars
hawk
bikes
hero
vehicle
Run Code Online (Sandbox Code Playgroud)
哈希以随机顺序存储它们的元素,因此我们必须携带位置信息.在以下解决方案中,我使用哈希值来携带唯一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);
Run Code Online (Sandbox Code Playgroud)
出于演示的目的,我没有用的文件,但在存储阵列中的记录@a和@b.
我使用数组元素作为键并使用唯一数字作为值来构建哈希值%ahash并%bhash从这些数组中构建哈希值.在这种情况下%ahash,这些ID与行号相同.您可以将ID %bhash视为具有偏移量的行号.
然后我收集散列之间不同的所有键值对.为此,我将所有键的列表放在%ahash和中%bhash.对于这些键中的每一个,我测试两个哈希中是否存在此键(我不使用exists,而是测试该值,因为我可以保证没有分配带有false值的ID - 除了0evaluate true 之外的所有数字).如果密钥存在于两个哈希中,则返回空列表().如果密钥只存在于其中一个哈希中,我将返回一个包含密钥和值的双元素列表,该列表位于%ahash或中%bhash.
在下一步中,我按其相关值按升序对所有不同的键进行排序,并按此顺序存储键@sorted.您可以将它们打印到文件中,我只需将它们转储,然后输出:
$VAR1 = [
'cars',
'bikes',
'vehicle',
'hawk',
'hero'
];
Run Code Online (Sandbox Code Playgroud)
我相信这符合您的标准.
基本上,你有一个非常优雅的算法来找到差异,但你没有包含排序数据,就像我使用我的行号一样ID.
在大多数情况下,使用词法文件句柄my比使用全局文件句柄更受欢迎.此外,三参数形式open更灵活,值得习惯.例如,我将你的第三行写成
my $filename1 = "a.txt";
open my $file1, '<', $filename1 or die qq{Could not open "$filename1": $!\n};
Run Code Online (Sandbox Code Playgroud)
但话说再来一次,TIM TOWTDI.