你有:
my $sDatabase = "abc_def:xyz_comp.";
if ($sDatabase =~ m/^(\w)*\:(\w*)\_em\.$/);
讓我們來看看這個匹配:
你」正則表達式說:
- 錨定在行的開頭。
- 您在尋找零或更多單詞字符。字字符(在ASCII字母)包括小寫字母,大寫字母數字和強調。
- 因此
/\w*/
將匹配以下所有:
- 計算機
- 計算機
- computer23
- computer_32
- 一個空字符串
- 接下來是你尋找一個冒號
- 那麼,隨之而來的是
_em
串
- 多個單詞字符
- 隨後一段
- 這應該是字符串的結尾(如果沒有NL和你沒有做多行字符串搜索。看起來你在那裏安全)。
現在,讓我們看看你的字符串:abc_def:xyz_comp.
\w*
將匹配高達abc_def
。正則表達式是貪婪的,並儘可能匹配字符串的最大部分。
:
將匹配冒號。到目前爲止,您匹配abc_def:
。
- 那
\w*
將匹配xyz_comp
。
- 現在,您正在嘗試匹配
_em
。哎呀!不好。字符串中沒有_em
。您的正則表達式匹配將失敗。
因爲你的正則表達式匹配失敗,則$1
和$2
變量根本沒有設置,沒有任何價值。
這就是爲什麼你會得到Use of uninitialized value
。你可以做的是讓後來的表達的一半可選:
my $sDatabase = "abc_def:xyz_comp.";
if ($sDatabase =~ /^(\w)+:(\w*)(_em)?\.$/) {
if ($3) {
print "$1:${2}${3}.\n";
else {
print "$1:${2}_em.";
}
}
else {
die qq(String doesn't match regular expression at all\n);
}
}
首先,我想你想至少匹配一個字符(我可能是錯的) ,因此我將匹配零個或多個的星號切換爲與一個或多個匹配的+
。
注意我有第三組圓括號,然後是?
。這意味着匹配這個零或一個次。因此,只要您的字符串以一個或多個單詞字符開頭,後跟一個冒號,後跟一個或多個單詞字符,就會設置爲$1
和$2
。
不一定會發生的是$3
將被設置。只有當您的字符串也以_em.
結尾時纔會設置。如果您的字符串不包含_em
,但以句點結尾,則$1
和$2
仍將匹配。
在你的情況,我們可以通過這樣簡化它:
my $sDatabase = "abc_def:xyz_comp.";
if ($sDatabase =~ /^(\w)+:(\w*)(?:_em)?\.$/) {
print "$1:${2}_em.";
else {
die qq(String doesn't match regular expression at all\n);
}
的(?:...)
手段不設置匹配,只是組。因此,$3
將永遠不會被設置。沒關係,無論是$ 3還是_em.
,或者我們都會在比賽結束時加上_em.
。
。那麼我想要$ sDatabase =「abc_def:xyz_comp」。 請幫忙。 – 2013-04-29 19:32:20
啊我明白了。好的,我修好了。 – Borodin 2013-04-29 19:47:16
如何無條件地「打印」$ 1:$ 2 $ 3。\ n「'倖存了m //之後? – pilcrow 2013-04-29 20:44:55