2012-07-12 32 views
2

如果我有一個變量:我分配的整個文件文本,使其的grep在Perl沒有陣列

$var = `cat file_name` 

假設該文件中,這個詞「我的」來自於17線(位置不可用,但只是給例如),如果在這些行中存在模式'word',我想在'mine'這個單詞的N個(例如10個)行之後搜索一個模式'word'。我怎樣才能做到這一點在正則表達式,而無需使用數組」

實施例:

$var = "I am good in perl\n but would like to know about the \n grep command in details"; 

我要搜索特定圖案在特定行(行2到僅3)。我怎樣才能做到這一點,而不使用數組。

+0

不能使用數組。你必須首先將你的字符串分成一行。 – lanzz 2012-07-12 08:16:15

+1

如果你願意放棄'grep',我肯定這可以不使用數組來完成,但它會很醜陋......你想要誰? – Flimzy 2012-07-12 08:21:08

+0

請澄清你的問題,這很難理解。 – SexyBeast 2012-07-12 09:51:54

回答

-1

試試這個:

perl -ne '$m=$. if !$m && /first-pattern/; 
print if $m && ($.-$m >= 2 && $.-$m <= 3) && /second-pattern/' 
+0

這不回答問題 – Zaid 2012-07-12 10:33:02

+0

已更新。當我第一次讀這個問題時,我發誓它爲我回答了這個問題。他們必須編輯它 – fork0 2012-07-12 18:01:53

0

您可以用正則表達式匹配這樣做:

my $var = `cat $filename`; 
while ($var =~ /foo/g) { 
    print $1, "\n"; 
    print "match occurred at position ", pos($var), " in the string.\n"; 
} 

這將從您的字符串打印出字符串「富」的所有的比賽,類似於grep但不使用數組(或列表)。/$ regexp/g語法使正則表達式從左到右迭代匹配字符串。

我建議閱讀perlrequick以獲取與正則表達式匹配的教程。

+1

我想要在10行後才能找到模式。 – user1489276 2012-07-12 08:36:08

1

這裏有一個不使用數組的有效情況 - 當文件非常大時。

這是一個非常具體的要求。而不是拐彎抹角地發現Perl的成語,我會開一個子程序:

sub n_lines_apart { 

    my ($file, $n, $first_pattern, $second_pattern) = @_; 

    open my $fh, '<', $file or die $!; 

    my $lines_apart; 

    while (<$fh>) { 

     $lines_apart++ if qr/$first_pattern/ .. qr/$second_pattern/; 
    } 

    return $lines_apart && $lines_apart <= $n+1; 
} 

買者

上述子沒有被設計在一個單一的文件來處理多個匹配。讓它成爲讀者的練習。

+0

OP指出整個文件內容都在一個單獨的變量中,所以他已經把它變成了一個標量,這意味着文件不是非常大。但無論如何,因爲一次只讀取一行文件而不是啜泣它通常是正確的事。 – 2012-07-12 13:00:26