我在文本文档中保存了一行,我将其读入数组。这条线是
John is the uncle of Sam
我有另一个包含aunt
,uncle
和father
字样的数组。我希望两个数组都比较并输出叔叔(不区分大小写)。我不知道我做错了什么。我使用List::Compare,Array::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;
答案 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);
然后你得到一个包含单词的数组,你可以将它与另一个单词进行比较。