不使用哈希打印匹配行

时间:2014-04-27 14:20:34

标签: perl

我想在两个文件中匹配两个不同的文件,但不使用哈希函数。但我不知道这样做。你能帮忙吗

这是我的意见:

文件1:

delhi  
bombay  
kolkata  
shimla  
ghuhati

文件2:

london  
delhi  
jammu  
punjab  
shimla  

输出:

delhi  
shimla  

代码存根:

#/usr/bin/perl

use strict;
use warnings;

my @line1 = <file1>;
my @line2 = <file2>;

while (<file1>) {
    do stuff;
}

3 个答案:

答案 0 :(得分:0)

当然,您可以在不使用哈希的情况下以非常低效的方式执行此操作:

my @line1 = <file1>;
my @line2 = <file2>;

foreach (@line1) {
    if (isElement($_, \@line2)) {
        print;
    }
}

sub isElement {
    my ($ele, $arr) = @_;

    foreach (@$arr) {
        if ($ele eq $_) {
            return 1;
        }
    }
    return 0;
}

答案 1 :(得分:0)

你真的需要一个很好的理由不使用哈希来解决这个问题。这是家庭作业吗?

这将按照你的要求行事。它将所有file1读入数组,然后一次读取file2一行,使用grep检查名称是否出现在数组中。

use strict;
use warnings;
use autodie;

my @file1 = do {
  open my $fh, '<', 'file1.txt';
  <$fh>;
};
chomp @file1;

open my $fh, '<', 'file2.txt';
while (my $line = <$fh>) {
  chomp $line;
  print "$line\n" if grep { $_ eq $line } @file1;
}

<强>输出

delhi
shimla

答案 2 :(得分:0)

你不想使用哈希?我可以使用模块吗?

最简单的方法可能是避免使用Perl,但使用Unix sortcomm实用程序:

$ sort -u file1.txt > file1.sort.txt
$ sort -u file2.txt > file2.sort.txt
# comm -12 file1.sort.txt file2.sort.txt

comm实用程序打印出三列:第一列是仅在第一个文件中找到的行。第二列是仅在第二个文件中找到的行,最后一列是在两个文件中找到的行。 -12参数禁止打印#1和#2列,只为您提供共同的行。

您可以使用双循环,将每个值彼此进行比较,如Lee Duhem所做的那样,但效率非常低。花费的时间增加了项目数的平方。