1

私は 2 つの配列を持っています。1 つは検索語で、もう 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

常にプログラムの開始時に、 を使用して最初に使用する時点ですべての変数を宣言する必要がuse strictあります。これは、コードについて助けを求めている場合に特に当てはまります。この測定により、多くの単純な間違いがすぐに明らかになる可能性があるからです。use warningsmy

Raze2dust が言ったように、ファイルから読み取られた行には末尾に改行"\n"文字があることを覚えておくことが重要です。行のペア間の正確な一致をチェックしている場合、これは問題になりませんが、機能しないため、 の文字列はの行のどこsearchTerms.txtにでも現れる可能性があると思います。つまり、 ;の文字列を使用する必要があります。他のファイルからの行はそのままにしておくことができます。fileToSearchIn.xmlchompsearchTerms.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 に答える
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 に答える