Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl搜索仅显示最后一个结果_Perl_Search - Fatal编程技术网

Perl搜索仅显示最后一个结果

Perl搜索仅显示最后一个结果,perl,search,Perl,Search,我有两个数组,一个带有搜索词,另一个是从文件中提取的多行。我有一个嵌套的foreach语句,正在搜索所有组合,但只显示最后一个匹配,尽管我知道还有许多其他匹配!!我尝试了许多不同版本的代码,但这里是我的最后一个版本: open (MYFILE, 'searchTerms.txt'); open (MYFILE2, 'fileToSearchIn.xml'); @searchTerms = <MYFILE>; @xml = <MYFILE2>; close(MYFILE

我有两个数组,一个带有搜索词,另一个是从文件中提取的多行。我有一个嵌套的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;
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,'