Perl搜索仅显示最后一个结果
我有两个数组,一个带有搜索词,另一个是从文件中提取的多行。我有一个嵌套的foreach语句,正在搜索所有组合,但只显示最后一个匹配,尽管我知道还有许多其他匹配!!我尝试了许多不同版本的代码,但这里是我的最后一个版本:Perl搜索仅显示最后一个结果,perl,search,Perl,Search,我有两个数组,一个带有搜索词,另一个是从文件中提取的多行。我有一个嵌套的foreach语句,正在搜索所有组合,但只显示最后一个匹配,尽管我知道还有许多其他匹配!!我尝试了许多不同版本的代码,但这里是我的最后一个版本: open (MYFILE, 'searchTerms.txt'); open (MYFILE2, 'fileToSearchIn.xml'); @searchTerms = <MYFILE>; @xml = <MYFILE2>; close(MYFILE
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;
open(MYFILE,'searchTerms.txt');
打开(MYFILE2,'fileToSearchIn.xml');
@搜索术语=;
@xml=;
关闭(MYFILE2);
关闭(MYFILE);
$results=“”;
foreach$searchIn(@xml)
{
foreach$searchFor(@searchTerms)
{
#打印“搜索$searchforin:$searchIn\n”;
如果($searchIn=~m/$searchFor/)
{
$temp=“搜索时在$searchIn中找到:$searchFor”;
$results=$results.$temp.“\n”;
$temp=“”;
}
}
}
打印$results;
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;
open(MYFILE,'searchTerms.txt');
打开(MYFILE2,'fileToSearchIn.xml');
@搜索术语=;
@xml=;
关闭(MYFILE2);
关闭(MYFILE);
$results=“”;
foreach$searchIn(@xml)
{
chomp($searchIn);
foreach$searchFor(@searchTerms)
{
chomp($searchFor);
#打印“搜索$searchforin:$searchIn\n”;
如果($searchIn=~m/$searchFor/)
{
$temp=“搜索时在$searchIn中找到:$searchFor”;
$results=$results.$temp.“\n”;
$temp=“”;
}
}
}
打印$results;
基本上,您认为您正在搜索“a”,但实际上它正在搜索“a\n”,因为这是它读取输入的方式,除非您使用
chomp
。只有当“a”是最后一个字符时,它才匹配,因为在这种情况下,它将以换行符结尾。在程序开始时,您应该始终使用strict
和使用warnings
,并在第一次使用时使用my
声明所有变量。这一点尤其适用于在代码方面寻求帮助的情况,因为这种方法可以很快发现许多简单的错误
正如Raze2dust所说,重要的是要记住,从文件中读取的行将有一个尾随的换行符“\n”
。如果您正在检查一对行之间的精确匹配,那么这无关紧要,但由于它对您不起作用,我假设searchTerms.txt
中的字符串可以出现在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时,您需要确保将输入记录分隔符设置为“searchterms.txt”的实际行分隔符样式。例如,如果“searchterms.txt”是在Windows框上生成的,则它的行分隔符将设置为“\r\n”。如果您在一个使用“\n”样式行分隔符的框上运行脚本,则记录分隔符将通过defualt设置为“\n”,因此
chomp
将在每行末尾留下\r
字符,并且您仍然会被不匹配的搜索词卡住。嗯,我已经尝试过chomp,但没有解决问题,我按照你推荐的方式再次尝试,但仍然没有解决方案。。。因此,我将检查它是否正在离开\r\n我将尝试通过删除\r\n第一个确定,将所有文件上的\r\n全部替换为\r\n,现在情况更糟:)找不到任何结果:D@khaled您应该发布一些示例输入。你应该试试我在上面的评论中发布的grep
。您的搜索词中可能有元字符,这会导致不匹配。此外,由于您没有使用strict和warnings,也没有检查open
语句的返回值,因此可能会遇到许多您一无所知的问题。@khaled在这种情况下,请检查换行符。这些文件是保存在Windows还是Unix中的?因为我发布的代码适用于我(Mac/Unix)。无论如何,正如TLP所说,最好的方法是使用grep。但是如果您想这样做,您也可以尝试先用空字符串替换所有\r和\n,而不是chomp。听起来像是grep
的工作:grep-f searchTerms.txt fileToSearchIn.xml
非常感谢您提供的详细信息,我将安装该模块并进行尝试(这很有效:)但我不得不做一些愚蠢的事情,因为我将这两个文件从windows复制到linux,我只是在linux上创建了新的基于linux的文本文件,并简单地将内容从windows文本文件复制并粘贴到linux文本文件,保存了这些文件,并在新的linux创建的文件上进行了搜索,结果成功了:)谢谢大家,您可以使用这些文件使您的程序在任何行结束时都能工作。您需要安装它,但不需要use
行。然后你可以写打开我的$fh,'