2012-05-27 181 views
1

我有兩個數組,一個帶有搜索項,另一個是從文件中獲取的多行。我有一個嵌套的foreach語句,並且正在搜索所有組合,但只有最後一場比賽正在顯示,儘管我知道有很多其他比賽的事實!我已經嘗試了許多不同版本的代碼,但這裏是我的最後一個:Perl搜索僅顯示最後結果

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; 
+2

聽起來像是'grep'工作:'grep的-f searchTerms.txt fileToSearchIn.xml' – TLP

回答

0

在程序開始時,您應始終使用use strictuse warnings,並在首次使用時使用my聲明所有變量。這尤其適用於當您要求獲得代碼幫助時,因爲此措施可以快速顯示許多簡單的錯誤。

正如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; 
+0

非常感謝您的細節,我會安裝模塊,並嘗試它 – khaled

+0

這工作:)但我不得不做傻傻的,因爲我從windows複製這兩個文件到linux,我只是創建新的基於Linux的文本文件在linux上,並簡單地從Windows文本文件複製和粘貼到Linux的內容,保存這些文件,並搜索新的Linux創建的文件,它的工作:)謝謝大家 – khaled

+0

您可以使用['PerlIO :: eol']( https://metacpan.org/module/PerlIO::eol)讓程序在任何行結束時都能正常工作。您需要安裝它,但不需要使用「use」行。然後你可以編寫'打開我的$ fh',<:raw:eol(LF)','searchTerms.txt'或者死掉$!',然後所有東西都會顯示爲Unix行結束符。你可以使用'read_file($ fh,chomp => 1)'從這個文件句柄中啜泣。 – Borodin

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 \ n',因爲它是如何讀取輸入的,除非您使用chomp。它只有在'a'是最後一個字符時才匹配,因爲在這種情況下,它將被一個換行符繼承。

+2

當使用在這種情況下,格格,你會想,以確保輸入記錄分隔符被設置爲實際線'searchterms.txt'的分隔符樣式。例如,如果在Windows窗口上生成了「searchterms.txt」,則會將行分隔符設置爲「\ r \ n」。如果你在一個使用'\ n'樣式行分隔符的盒子上運行你的腳本,記錄分隔符將被設置爲'\ n',所以'chomp'會在每個末尾留下'\ r'字符行,你仍然會被搜索條件不匹配。 –

+0

嗯我已經嘗試chomp,但沒有解決問題,我再次嘗試它的方式,你推薦,仍然沒有解決方案...所以我會檢查,也許它是離開\ r \ n我試試並修復,通過刪除\ r首先 – khaled

+0

好吧,我用\ n替換了所有文件中的所有文件,現在它實際上更糟糕:)它沒有找到任何結果:D – khaled