2

我有变量包含:No such file or directory at ./EMSautoInstall.pl line 50.

我想创建变量包含No such file or directory,另一个包含at ./EMSautoInstall.pl line 50.

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

当我打印两个变量时,第一个包含No such file or directory但第二个为空。

为什么会这样?

4

3 回答 3

7

真的$!变量中有那个字符串吗?因为通常情况下,该at line...部分是由die和相加的warn。我怀疑你只是有

$! = "No such file or directory";

并且您的正则表达式匹配,因为它允许空字符串

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

即第二次捕获也没有匹配,第一次捕获可以是任何不以at.

确认,

print $!;

应该打印No such file or directory

于 2013-08-19T15:53:36.617 回答
2

在这里使用split前瞻断言比正则表达式捕获更有意义:

my ( $eStmnt, $lineNO ) = split /(?=at)/, $!;
于 2013-08-19T15:45:41.853 回答
1

你可以使用这个:

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

这个想法是匹配所有不是“a”或不是“at”单词一部分的“a”

细节:

(                 # 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))++)(.*+)
于 2013-08-19T15:43:58.097 回答