2013-08-19 203 views
2

分組我有變量包含:No such file or directory at ./EMSautoInstall.pl line 50.正則表達式在Perl

我想創建變量包含No such file or directory,另一個包含at ./EMSautoInstall.pl line 50.

我正則表達式是:my ($eStmnt, $lineNO) = $! =~ /(.*[^a][^t])(.*)/;

當我打印兩個變量中,第一個包含No such file or directory,但第二個是空的。

爲什麼會發生這種情況?

+1

對於一般的Perl正則表達式幫助,從'perldoc perlrequick'開始,當你已經征服它時,轉到'perldoc perlre'。 – ThisSuitIsBlackNot

回答

7

真的$!變量中有那個字符串嗎?因爲通常,at line...部分由diewarn加上。我懷疑你只是有

$! = "No such file or directory"; 

而且您正則表達式匹配,因爲它允許空字符串

/(.*[^a][^t])(.*)/ 

即第二次捕獲也不匹配,第一次捕獲可以是任何不以at結束的事情。

要確認,

print $!; 

應打印No such file or directory

+0

是的,你是對的:) –

+2

@M_E神祕解決了。 :)如果有疑問,'Data :: Dumper'模塊是一個很好的調試工具:'print Dumper $ variable'。 – TLP

+1

+1,好偵探工作 – Zaid

1

您可以使用此:

((?:[^a]+|\Ba|a(?!t\b))+)(.*) 

的想法是匹配所有這不是一個「一」或「一個」不「在」

細節字的一部分:

(    # first capturing group 
    (?:   # open a non capturing group 
     [^a]+  # all that is not a "a" one or more times 
     |   # OR 
     \Ba  # a "a" not preceded by a word boundary 
     |   # OR 
     a(?!t\b) # "a" not followed by "t" and a word boundary 
    )+   # repeat the non capturing group 1 or more times 
)     # close the capturing group 
(.*)    # the second capturing group 

您可以改進這種模式,用原子組代替非捕獲組,用佔有量詞替代量子。我們的目標是通過回溯位置的正則表達式引擎禁止的紀錄,但結果保持不變:

((?>[^a]++|\Ba|a(?!t\b))++)(.*+) 
+0

你能解釋一下嗎?這是我第一次看到,因爲我是Perl新手。 –

+0

非常感謝@Casimir et Hippolyte –

+0

我想問你我從哪裏可以獲得REGEX的這些知識 –

2

使用split這裏先行斷言使得比正則表達式捕獲更多的意義:

my ($eStmnt, $lineNO) = split /(?=at)/, $!; 
+0

「?=」是什麼意思? –