Perl 中的文件比较 - 按行或子字符串
File comparison in Perl - by line or substring
我正在尝试比较 2 个文本文件,我得到了以下 perl 脚本,但出于某种原因,即使我使用 /same/ 文件作为基础和过滤器,它也没有输出任何内容。我真的是 Perl 的新手,如果这听起来很基础,我深表歉意。
my $file_base = 'CSP8216.TXT';
my $file_filter = 'CSP8216.TXT';
open my $info_filter, $file_filter or die "Die: Could not open $file_filter: $!";
while(my $line_filter = <$info_filter>)
{
open my $info_base, $file_base or die "Die: Could not open $file_base: $!";
while(my $line_base = <$info_base>)
{
if("$line_filter"=="$line_base")
#if(substr($line_filter, 0, 11)==substr($line_base, 0, 11))
{
print $line_base;
}
}
close $info_bae;
}
close $info_filter;
有人能指出为什么这似乎不起作用吗?
使用eq
比较字符串:
if($line_filter eq $line_base)
。
还可以使用 use strict
查看程序中的错误
我会做一些不同的
显然,如果文件很大,您可能确实想将文件推送到数组中。
use strict;
use warnings;
use Data::Dumper;
my $file_base = '1.TXT';
my $file_filter = '2.TXT';
open ( FILTER, "<$file_filter" )
or die "Die: Could not open $file_filter: $!";
open ( BASE, "<$file_base" )
or die "Die: Could not open $file_base: $!";
my @filterArray = <FILTER>;
my @baseArray = <BASE>;
close BASE;
close FILTER;
unless( arrayDiff( \@filterArray , \@baseArray ) )
{
print "Success!";
}
sub arrayDiff {
my $array1 = shift(@_);
my $array2 = shift(@_);
my %array1_hash;
my %array2_hash;
# Create a hash entry for each element in @array1
for my $element ( @{$array1} ) {
$array1_hash{$element} = @{$array1};
}
# Same for @array2: This time, use map instead of a loop
map { $array2_hash{$_} = 1 } @{$array2};
for my $entry ( @{$array2} ) {
if ( not $array1_hash{$entry} ) {
return 1; #Entry in @array2 but not @array1: Differ
}
}
if ( keys %array1_hash != keys %array2_hash ) {
return 1; #Arrays differ
}
else {
return 0; #Arrays contain the same elements
}
}
perl 1156663.pl
成功!
我正在尝试比较 2 个文本文件,我得到了以下 perl 脚本,但出于某种原因,即使我使用 /same/ 文件作为基础和过滤器,它也没有输出任何内容。我真的是 Perl 的新手,如果这听起来很基础,我深表歉意。
my $file_base = 'CSP8216.TXT';
my $file_filter = 'CSP8216.TXT';
open my $info_filter, $file_filter or die "Die: Could not open $file_filter: $!";
while(my $line_filter = <$info_filter>)
{
open my $info_base, $file_base or die "Die: Could not open $file_base: $!";
while(my $line_base = <$info_base>)
{
if("$line_filter"=="$line_base")
#if(substr($line_filter, 0, 11)==substr($line_base, 0, 11))
{
print $line_base;
}
}
close $info_bae;
}
close $info_filter;
有人能指出为什么这似乎不起作用吗?
使用eq
比较字符串:
if($line_filter eq $line_base)
。
还可以使用 use strict
查看程序中的错误
我会做一些不同的 显然,如果文件很大,您可能确实想将文件推送到数组中。
use strict;
use warnings;
use Data::Dumper;
my $file_base = '1.TXT';
my $file_filter = '2.TXT';
open ( FILTER, "<$file_filter" )
or die "Die: Could not open $file_filter: $!";
open ( BASE, "<$file_base" )
or die "Die: Could not open $file_base: $!";
my @filterArray = <FILTER>;
my @baseArray = <BASE>;
close BASE;
close FILTER;
unless( arrayDiff( \@filterArray , \@baseArray ) )
{
print "Success!";
}
sub arrayDiff {
my $array1 = shift(@_);
my $array2 = shift(@_);
my %array1_hash;
my %array2_hash;
# Create a hash entry for each element in @array1
for my $element ( @{$array1} ) {
$array1_hash{$element} = @{$array1};
}
# Same for @array2: This time, use map instead of a loop
map { $array2_hash{$_} = 1 } @{$array2};
for my $entry ( @{$array2} ) {
if ( not $array1_hash{$entry} ) {
return 1; #Entry in @array2 but not @array1: Differ
}
}
if ( keys %array1_hash != keys %array2_hash ) {
return 1; #Arrays differ
}
else {
return 0; #Arrays contain the same elements
}
}
perl 1156663.pl
成功!