在 Perl 中比较两个文本文件
Compare two text files in Perl
我在两个 .txt 文件中有几个字符串。它们都包含一些相似的字符串,但没有排列在同一个行号上。
例如,
file1.txt
卡门
爱迪生
莫莉
杰森
达蒙
杰拉德
file2.txt
爱迪生
杰森
我想将在两个文本文件(在本例中为 Edison Jason)中找到的相似字符串保存到一个数组中。
有多种数组实用程序库可用于实现此目的 - 您特别需要的是交集,Array::Utils 是实现此目的的较简单的库之一;
#!/usr/bin/env perl
use strict;
use warnings;
use File::Slurp qw(read_file);
use Array::Utils qw(intersect);
my $file1 = 'file1.txt';
my $file2 = 'file2.txt';
my @data1 = split( /\s/, read_file($file1) );
my @data2 = split( /\s/, read_file($file2) );
my @intersect = intersect( @data1, @data2 );
print join(', ', @intersect), "\n";
或者,不需要 Array::Utils
#!/usr/bin/env perl
use strict;
use warnings;
my @data1 = qw( Carmen Edison Molly Jason Damon Gerard );
my @data2 = qw( Edison Jason );
sub intersect {
my %e = map { $_ => undef } @{$_[0]};
return grep { exists( $e{$_} ) } @{$_[1]};
}
my @intersect = intersect( \@data1, \@data2 );
print join(', ', @intersect), "\n";
无需使用额外的模块
#!/usr/bin/env perl
use strict;
use warnings;
my @data1 = qw( Carmen Edison Molly Jason Damon Gerard );
my @data2 = qw( Edison Jason );
my @data3 = ();
foreach my $d1 ( @data1 )
{
chomp $d1;
foreach my $d2 ( @data2 )
{
chomp $d2;
if( $d1 eq $d2 )
{
print "Match Found : $d1, $d2 \n";
push @data3, $d1;
}
}
}
你可以这样做而不需要安装任何额外的模块
#!/usr/bin/perl
use warnings;
use strict;
my (@file1,@file2,@match);
open FILE1, "<", 'file1.txt';
@file1 = <FILE1>;
close FILE1;
open FILE2, "<", 'file2.txt';
@file2 = <FILE2>;
close FILE2;
chomp (@file1,@file2);
foreach(@file1) {
if ($_ ~~ @file2) {
push @match, $_;
}
}
print "\nMatches\n";
foreach(@match) { print "The same -- $_\n"; }
我在两个 .txt 文件中有几个字符串。它们都包含一些相似的字符串,但没有排列在同一个行号上。
例如, file1.txt 卡门 爱迪生 莫莉 杰森 达蒙 杰拉德
file2.txt 爱迪生 杰森
我想将在两个文本文件(在本例中为 Edison Jason)中找到的相似字符串保存到一个数组中。
有多种数组实用程序库可用于实现此目的 - 您特别需要的是交集,Array::Utils 是实现此目的的较简单的库之一;
#!/usr/bin/env perl
use strict;
use warnings;
use File::Slurp qw(read_file);
use Array::Utils qw(intersect);
my $file1 = 'file1.txt';
my $file2 = 'file2.txt';
my @data1 = split( /\s/, read_file($file1) );
my @data2 = split( /\s/, read_file($file2) );
my @intersect = intersect( @data1, @data2 );
print join(', ', @intersect), "\n";
或者,不需要 Array::Utils
#!/usr/bin/env perl
use strict;
use warnings;
my @data1 = qw( Carmen Edison Molly Jason Damon Gerard );
my @data2 = qw( Edison Jason );
sub intersect {
my %e = map { $_ => undef } @{$_[0]};
return grep { exists( $e{$_} ) } @{$_[1]};
}
my @intersect = intersect( \@data1, \@data2 );
print join(', ', @intersect), "\n";
无需使用额外的模块
#!/usr/bin/env perl
use strict;
use warnings;
my @data1 = qw( Carmen Edison Molly Jason Damon Gerard );
my @data2 = qw( Edison Jason );
my @data3 = ();
foreach my $d1 ( @data1 )
{
chomp $d1;
foreach my $d2 ( @data2 )
{
chomp $d2;
if( $d1 eq $d2 )
{
print "Match Found : $d1, $d2 \n";
push @data3, $d1;
}
}
}
你可以这样做而不需要安装任何额外的模块
#!/usr/bin/perl
use warnings;
use strict;
my (@file1,@file2,@match);
open FILE1, "<", 'file1.txt';
@file1 = <FILE1>;
close FILE1;
open FILE2, "<", 'file2.txt';
@file2 = <FILE2>;
close FILE2;
chomp (@file1,@file2);
foreach(@file1) {
if ($_ ~~ @file2) {
push @match, $_;
}
}
print "\nMatches\n";
foreach(@match) { print "The same -- $_\n"; }