我的变量包含:No such file or directory at ./EMSautoInstall.pl line 50.
我想创建包含No such file or directory
的变量,另一个包含at ./EMSautoInstall.pl line 50.
我的REGEX是:my ( $eStmnt, $lineNO ) = $! =~ /(.*[^a][^t])(.*)/;
当我打印两个变量时,第一个变量包含No such file or directory
但第二个变量为空。
为什么会这样?
答案 0 :(得分:7)
你真的在$!
变量中有那个字符串吗?通常,at line...
部分由die
和warn
添加。我怀疑你只是
$! = "No such file or directory";
你的正则表达式匹配,因为它允许空字符串
/(.*[^a][^t])(.*)/
即。第二次捕获也不匹配,第一次捕获可以是任何不以at
结束的捕获。
确认,
print $!;
应打印No such file or directory
。
答案 1 :(得分:2)
在这里使用split
前瞻断言比正则表达式捕获更有意义:
my ( $eStmnt, $lineNO ) = split /(?=at)/, $!;
答案 2 :(得分:1)
您可以使用:
((?:[^a]+|\Ba|a(?!t\b))+)(.*)
这个想法是匹配所有不是“a”或“a”的东西,而不是“at”这个词的一部分
细节:
( # 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))++)(.*+)