【问题标题】:File comparison in Perl - by line or substringPerl 中的文件比较 - 按行或子字符串
【发布时间】:2016-06-15 09:49:25
【问题描述】:

我正在尝试比较 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查看程序中的错误
  • 与 eq 合作,我编辑了我的问题。谢谢詹斯!
  • 你不应该更改问题,因为编辑后问题没有意义
  • 我已将我的评论添加为答案。随意接受和/或投票

标签: perl file compare line


【解决方案1】:

使用eq比较字符串:

if($line_filter eq $line_base)

也可以使用use strict 查看程序中的错误

【讨论】:

    【解决方案2】:

    我会做一些不同的事情 显然,如果文件很大,您可能确实希望将文件推送到数组中。

    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

    成功了!

    【讨论】:

      猜你喜欢
      • 2021-03-16
      • 2016-06-16
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      • 2014-05-31
      • 2015-06-17
      • 1970-01-01
      • 2015-10-06
      相关资源
      最近更新 更多