1

我有两个数组,一个带有搜索词,另一个是从文件中获取的多行。我有一个嵌套的 foreach 语句并且正在搜索所有组合,但只有最后一个匹配显示,即使我知道还有很多其他匹配!我尝试了许多不同版本的代码,但这是我的最后一个:

open (MYFILE, 'searchTerms.txt');
open (MYFILE2, 'fileToSearchIn.xml');

@searchTerms = <MYFILE>;
@xml = <MYFILE2>;

close(MYFILE2);
close(MYFILE);
$results = "";

foreach $searchIn (@xml)
{
    foreach $searchFor (@searchTerms)
    {
        #print "searching for $searchFor in: $searchIn\n";
        if ($searchIn =~ m/$searchFor/)
        {
            $temp = "found in $searchIn \n while searching for: $searchFor ";
            $results = $results.$temp."\n";
            $temp = "";
        }
    }
}

print $results;
4

2 回答 2

0

chomp删除换行符的输入:

open (MYFILE, 'searchTerms.txt');
open (MYFILE2, 'fileToSearchIn.xml');

@searchTerms = <MYFILE>;
@xml = <MYFILE2>;

close(MYFILE2);
close(MYFILE);
$results = "";

foreach $searchIn (@xml)
{
    chomp($searchIn);
    foreach $searchFor (@searchTerms)
    {
        chomp($searchFor);
        #print "searching for $searchFor in: $searchIn\n";
        if ($searchIn =~ m/$searchFor/)
        {
            $temp = "found in $searchIn \n while searching for: $searchFor ";
            $results = $results.$temp."\n";
            $temp = "";
        }
    }
}

print $results;

基本上,您认为您正在搜索“a”,但实际上它正在搜索“a\n”,因为除非您使用chomp. 仅当 'a' 是最后一个字符时才匹配,因为在这种情况下,它将被换行符取代。

于 2012-05-27T16:13:55.103 回答
0

您应该始终在程序开始时use strict使用. 这尤其适用于您寻求代码帮助时,因为此措施可以快速揭示许多简单的错误。use warningsmy

正如 Raze2dust 所说,重要的是要记住从文件中读取的行将有一个尾随换行符"\n"。如果您正在检查一对行之间的精确匹配,那么这无关紧要,但由于它不适合您,我假设字符串searchTerms.txt可以出现fileToSearchIn.xml. 这意味着您需要使用来自;chomp的字符串。searchTerms.txt其他文件中的行可以保持原样。

File::Slurp通过使用该模块,这样的事情变得容易多了。它为您完成所有文件处理,如果您要求,它将从输入文本中剔除任何换行符。

我已更改您的程序以使用此模块,以便您了解它是如何工作的。

use strict;
use warnings;

use File::Slurp;

my @searchTerms = read_file('searchTerms.txt', chomp => 1);
my @xml = read_file('fileToSearchIn.xml');

my @results;

foreach my $searchIn (@xml) {
  foreach my $searchFor (@searchTerms) {
    if ($searchIn =~ m/$searchFor/) {
      push @results, qq/Found in "$searchIn"\n while searching for "$searchFor"/;
    }
  }
}

print "$_\n" for @results;
于 2012-05-27T16:57:24.940 回答