我有两个数组,一个是搜索词,另一个是从文件中提取的多行。我有一个嵌套的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;
答案 0 :(得分: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'是最后一个字符时匹配,因为在这种情况下,它将由换行符继续。
答案 1 :(得分:0)
您应始终在程序开始时use strict
和use warnings
,并使用my
在首次使用时声明所有变量。这尤其适用于您在寻求代码帮助时,因为此措施可以快速揭示许多简单的错误。
正如Raze2dust所说,重要的是要记住从文件中读取的行将具有尾随换行符"\n"
。如果您正在检查一对行之间的完全匹配,那么这无关紧要,但由于它不适合您,我认为searchTerms.txt
中的字符串可以在任何地方出现 / em>在fileToSearchIn.xml
的行中。这意味着您需要使用searchTerms.txt
来自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;
的字符串;另一个文件中的行可以保持不变。
使用chomp
模块可以更轻松地完成这样的事情。它为您完成所有文件处理,如果您要求,它将从输入文本中选择任何换行符。
我已将程序更改为使用此模块,以便您可以看到它的工作原理。
{{1}}