2012-05-08 35 views
3

我正在尋找一種解決方案來在Perl中執行此操作。Perl模式匹配,我們打印所有匹配的部分,但只匹配部分(而不是其他部分)

例子: 如果我的字符串是:

my $content = 'toto /app/blah titi\nhuh/app/ttt wew'; 

,我的模式是:/app/something我想作爲陣列中輸出:/app/blah/app/ttt

(這基本上是什麼grep -E -o '\/app\/[a-z]*'一樣)

我無法得到它的工作! 我想:

my $content = 'toto /app/blah titi\nhuh/app/ttt wew'; 
$content =~ m/(\/app\/[a-z]*)/; 
print "Group: $1 $2\n"; 

但這只是打印:/app/blah(未/app/ttt

反正,我不知道如何把結果以表格:

my (@table) = @_; 

的表不包含任何東西!

THX

回答

5

您想使用/g修改,使正則表達式返回所有比賽的名單:

@table = $content =~ m/(\/app\/[a-z]*)/g; 
print "Group: @table\n"; 

此外,@_沒有任何與正則表達式。相反,它是傳遞給當前子例程的參數列表。

+0

而從您希望的命令行:'[「$(printf的「A0 B1 \ nc2 a3 \ n'| perl -ne'print m/a。/ g')「=」a0a3「] || exit 1' –

0

我工作的一個襯墊一些快速的bash腳本,其中的Perl將扮演一個部分,這個工作對我來說:

$ echo foo000bar000baz | perl -ne 'for(m/(foo)|(baz)/g){ if ($_ ne "") { print "$_\n"}}'    
foo 
baz 

作品具有多過於

$ echo 'foo 
> 123 
> bar 
> 456 
> baz ' | perl -ne 'for(m/(foo)|(baz)/g){ if ($_ ne "") { print "$_\n"}}' 
foo 
baz 

解釋(原諒和糾正我的錯誤,因爲我不是Perl的先進水平):

STDIN管道到perl:可能是任何東西,如cat $file

  1. m/Regular Expression within parenthesis indicating capture group/g
  2. 從比賽讓for loop上述
  3. 打印if匹配不""(空)