输出公共数组元素

时间:2013-08-06 11:40:28

标签: arrays perl compare

我在文本文档中保存了一行,我将其读入数组。这条线是

John is the uncle of Sam

我有另一个包含auntunclefather字样的数组。我希望两个数组都比较并输出叔叔(不区分大小写)。我不知道我做错了什么。我使用List::CompareArray::Utils qw(:all)等。有人可以给我一个有效的代码。我只需要比较部分。

到目前为止,这就是我所做的一切。

#!/usr/bin/env perl

use strict;
use warnings;
use Array::Utils qw':all';

print "Please enter the name of the file\n";
my $c = <STDIN>;
chomp($c);

open(NEW,$c) or die "The file cannot be opened";

my @d = <NEW>;


my @g = qw'aunt uncle father';
chomp(@g);
chomp(@d);

my @isect = intersect(@g, @d);
print @isect;

2 个答案:

答案 0 :(得分:2)

最简单的方法:

for my $line (@file) {
    for my $word (@words) {
        if ($line =~ /\Q$word/i) {
            print "$word is found in '$line'";
        }
    }
}

您可以将单词合并为正则表达式,这样您就可以跳过循环的单词:

my $rx = join '|', map quotemeta, @words;
for my $line (@file) {
    if ($line =~ /$rx/i) {
        print "Match found";
    }
}

或使用grep

my @found = grep /$rx/i, @file;

答案 1 :(得分:2)

你有一个包含3个元素的数组(阿姨叔叔姐姐),你从文件中读取的那个只包含一个(!“约翰是山姆的叔叔”):

#!/usr/bin/perl

use strict;
use warnings;

my @searchwords = qw(aunt uncle sister);
my @article = ("John is the uncle of Sam",);

foreach my $searchword (@searchwords){
    my $pattern = quotemeta $searchword;

    foreach my $line (@article){
        if ($line =~ /$pattern/i){  
            # //i makes the match case insensitive
            print $searchword . " matched in " . $line . "\n";
        }
    }
}

如果你想在一个数组中包含该行的每个单词,你应该在split上的行中使用@words_from_line = split(" ",$line);然后你得到一个包含单词的数组,你可以将它与另一个单词进行比较。