2013-05-02 79 views
1

我有一個字符串中的變量:在Perl中提取子字符串?

$mystr = "some text %PARTS/dir1/dir2/myfile.abc some more text"; 

現在%PARTS是字符串中字面上存在,它不是一個變量或散列。 我想從中提取子字符串%PARTS/dir1/dir2/myfile.abc。我創建了以下reg表達式。我只是Perl的初學者。所以請讓我知道如果我做錯了什麼。

my $local_file = substr ($mystr, index($mystr, '%PARTS'), index($mystr, /.*%PARTS ?/)); 

我甚至試過這樣:

my $local_file = substr ($mystr, index($mystr, '%PARTS'), index($mystr, /.*%PARTS' '?/)); 

但無論給什麼,如果我打印$local_file。 這裏可能有什麼問題? 謝謝。

UPDATE:簡稱爲以下站點爲使用這種方法:

  1. http://perlmeme.org/howtos/perlfunc/substr.html見實施例1c
  2. How to take substring of a given string until the first appearance of specified character?

回答

3

index函數返回字符串的出現的第一索引在字符串中,否則-1。它與正則表達式無關。

正則表達式應用於具有綁定運算符=~的字符串。

要提取正則表達式的匹配區域,請將圖案封閉在parens中(捕獲組)。然後將匹配的子將在$1

my $str = "some text %PARTS/dir1/dir2/myfile.abc some more text"; 
if ($str =~ /(%PARTS\S+)/) { 
    my $local_file = $1; 
    ...; # do something 
} else { 
    die "the match failed"; # do something else 
} 

\S字符類將每一個非空格字符匹配。

要了解正則表達式,您可以查看perlretut

+0

@stema:不能使用捕獲組直接分配匹配的零件。如果您使用'$&',則可以避免該組,如果使用組或列表上下文加'/ g',則可避免使用$ 1。 – choroba 2013-05-02 12:07:44

+0

不好的例子。你不檢查正則表達式是否失敗,這可能會從其他一些正則表達式中執行$ 1。最簡單的方法就是在dolmen的回答中顯示的。 – ysth 2013-05-02 15:45:40

+0

@amon謝謝你的詳細解答。作品像一個魅力:) – 2013-05-03 05:33:51

2

index函數與regexps無關。它的參數只是字符串,而不是正則表達式。所以你的用法是錯誤的。

Regexps是Perl的一個強大的特性和該任務的最合適的工具:

my ($local_file) = $mystr =~ /(%PARTS[^ ]+)/; 

有關=~運營商的更多信息,請參見perlop

+0

感謝您的答案@dolmen – 2013-05-03 05:35:01