2015-11-05 33 views
0

我想使用perl中的索引函數查找所有匹配的位置。棘手的部分是我的查詢裏面有可變字母(我在這裏使用一個簡單的例子)。perl:包含未指定字符的索引查詢

my $query="b\wll"; 
my $string= "I see a ball on a bull"; 

my $output = index($string, $query, $offset); 
while ($output != -1) { 

     print "$char\t$output\n"; 

我想輸出是

ball 8 
bull 18 

它應該是這個樣子,但我不能得到它的工作。能否請你幫忙 ?

+2

'的perldoc -f index':第二arg是一個字符串,而不是一個正則表達式。 – toolic

+0

你想計算重疊比賽嗎?例如,如果字符串是'aaa'而查詢是'aa',你會返回兩個匹配(索引0和1)還是隻返回一個匹配(索引0)? – ThisSuitIsBlackNot

+2

在你寫的每一個* Perl程序開始的時候,請總是*使用嚴格的''使用警告'all'',特別是在尋求幫助之前。這項措施會直接指出您對問題的回答 – Borodin

回答

3

\w未在雙引號字符串文字中定義。

$ perl -wE'say "b\wll";' 
Unrecognized escape \w passed through at -e line 1. 
bwll 

要創建的字符串b\wll,你需要

"b\\wll" 

在這種情況下,你也可以使用,因爲你正在創建一個正則表達式如下:

qr/b\wll/ 

所以,解決第一個問題,但第二個問題:index對正則表達式沒有任何瞭解。你需要使用匹配運算符。

my $pattern = "b\\wll"; 
my $string = "I see a ball on a bull"; 

while ($string =~ /($pattern)/g) { 
    print "$-[1]\t$1\n"; 
} 

當使用標量上下文匹配操作符,我們可以看到使用@-每場比賽匹配。

+0

請參閱http://perldoc.perl.org/perlvar.html#%40LAST_MATCH_START,以瞭解在這裏使用魔術'@ -'變量的情況。 –

+0

@glenn jackman,謝謝,我剛剛補充說,現在我已經有了。 – ikegami

0

找到所有的比賽,和它以前的文本,然後加起來的字符串長度:

perl -E ' 
    my $query = q{b\wll}; 
    my $string = qq{I see a ball on a bull}; 
    my @matches = $string =~ /(.*?)($query)/g; 
    $, = qq{\t}; 
    for (my ($pos, $i) = (0,0); $i < @matches; $i+=2) { 
    $pos += length $matches[$i]; 
    say $matches[$i+1], $pos; 
    $pos += length $matches[$i+1]; 
    } 
' 
ball 8 
bull 18