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が、2 番目の変数は空です。

なぜこれが起こるのですか?

4

3 に答える 3

7

変数にその文字列が本当にありますか? $!通常、パーツはとat line...で追加されるためです。私はあなたが単に持っていると思いますdiewarn

$! = "No such file or directory";

空の文字列を許可するため、正規表現は一致します

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

つまり、2 番目のキャプチャも何も一致せず、最初のキャプチャは で終わらないものであれば何でもかまいませんat

確認するために、

print $!;

印刷する必要がありますNo such file or directory

于 2013-08-19T15:53:36.617 に答える
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 に答える