2016-05-22 5 views
0

私はサブルーチンと呼ばれる名前のキャプチャグループに捕獲されたキャプチャしたデータにアクセスしようとしている:perlのregexで名前付きキャプチャグループの値にアクセスするにはどうしたらいいですか?

use strict; 
use warnings; 
"this is a test" =~ /(?!) 
(?<isa>is\s+a) 
| (?&isa)\s 
(?<test>test)/x; 
print "isa: $+{isa}\ntest: $+{test}" 

そして、ここでは別の試みです:

use strict; 
use warnings; 
"this is a test" =~ /(?!) 
(?<isa_>(?<isa>is\s+a)) 
| (?&isa_)\s 
(?<test>test)/x; 
print "isa: $+{isa}\ntest: $+{test}" 

私が取得するように見えることはできません$ + {isa}を入力してください。それはなぜですか、どうすればいいですか?

+2

答えやコメントに示されたエラーを取り除くために質問を「修正」しないでください。 – Borodin

+0

@Bododin、質問の元の意図が損なわれ、それとその答えから気を散らしています。答えは問題ではなく固定されるべきです。 – Adrian

+0

私は同意しません。あなたの質問に訂正されたコードを追加したのではなく、それを元に戻すのが良いでしょう。しかし、少なくとも修正を必要と感じる場合は、回答を編集してください。現在のところ、あなたの質問は、両方の世界の最悪の答えではありません。 – Borodin

答えて

0

(?!)で最初のブランチが失敗するので、後で定義された名前付きキャプチャグループ(?<isa>...)は何もキャプチャしません(ただし、サブパターンとして定義されています)。

2番目のブランチだけが成功しますが、このグループは "isa"グループのものを取得しません。サブパターンの別名(?&isa_)を使用します。 "isa_は" どこにも定義されていないので、

Reference to nonexistent named group in regex 

あなたの最初の例では、警告を返します。

[編集]最初の例では "isa_"を "isa"に変更しましたが、この新しいバージョンでは、 "isa"という名前のグループには何もキャプチャされません。キャプチャグループは、彼らがいない他の場所で、定義されただけで物事を捉えるため、あなたの第二の例はあまりにも「ISA」を、移入しません

は(たとえisa_はグループisaを参照。)

理由は、Perlはdoesnのことです再捕捉でキャプチャを保存しないでください(地上レベルのキャプチャのみが保持されます)あなたはこの例でそれをテストすることができます。

"this is a test" =~/
    (?!) 
    (?<isa_> 
     (?<isa> is \s+ a) 
     (?{print "isa in recursion: $+{isa}\n"}) 
) 
| 
    (?&isa_) \s (?<test> test) 
/x; 

print "isa: $+{isa}\ntest: $+{test}" 

しかし、あなたが書くことができます。

"this is a test" =~/
    (?!) (?<isa_> is \s+ a) 
| 
    (?<isa> (?&isa_)) \s (?<test> test) 
/x; 

print "isa: $+{isa}\ntest: $+{test}"; 

しかし、ここでは、名前付きキャプチャ「ISAは」グランドレベルです。


注:このように

/(?<isa_> (?<isa> is \s+ a)){0} 
(?&isa_) \s (?<test> test) 
/x 

/(?(DEFINE) 
    (?<isa_> (?<isa> is \s+ a)) 
) 
(?&isa_) \s (?<test> test) 
/x 

か、この1:代わりにパターン失敗し、交代を作るために(?!)を使用して、あなたは(?(DEFINE)...)構文を使用することができますあなたは交代の費用を避けます。

+0

それで、サブルーチン内の名前付きキャプチャグループにアクセスすることは可能ですか? – Adrian

+0

ええ、最初のコードはコピーエラーでした。質問で訂正されました。私は先週先週の '(?(DEFINE)...)'構文についても知りました。私は '(?!)... |'構文を数年前から使っています。私は '(?{...})'を代わりに使用していたので、perlは地上レベルを上回るものをキャプチャしていないことに気づかなかっただけです。私は '...(* ACCEPT)|(?!)(_ subroutines_)'も使用しました。 – Adrian

関連する問題