perlの正規表現(??{ ... })内で$^Nがうまく動かないのは仕様?
コード。
use strict; use warnings; use re 'eval'; use re 'debug'; my $digit = qr{(\d)(?{print "\$^N: '$^N'\n"})}; my $_digit = qr{(??{$digit})}; # print "\$digit : ", '1' =~ /$digit/, "\n"; print "\$_digit: ", '1' =~ /$_digit/, "\n";
結果。
Compiling REx "(\d)(?{print %"\$^N: '$^N'\n%"})" Final program: 1: OPEN1 (3) 3: DIGIT (4) 4: CLOSE1 (6) 6: EVAL (8) 8: END (0) stclass DIGIT minlen 1 with eval Compiling REx "(??{$digit})" Final program: 1: LOGICAL[2] (2) 2: EVAL (4) 4: END (0) minlen 0 with eval Matching REx "(??{$digit})" against "1" 0 <> <1> | 1:LOGICAL[2](2) 0 <> <1> | 2:EVAL(4) Matching embedded REx "(\d)(?{print %"\$^N: '$^N'\n%"})" against "1" 0 <> <1> | 1: OPEN1(3) 0 <> <1> | 3: DIGIT(4) 1 <1> <> | 4: CLOSE1(6) 1 <1> <> | 6: EVAL(8) Use of uninitialized value $^N in concatenation (.) or string at (re_eval 1) line 1. 1 <1> <> | 8: END(0) EVAL trying tail ... 0 1 <1> <> | 4: END(0) Match successful! $^N: '' $_digit: 1 Freeing REx: "(??{$digit})" Freeing REx: "(\d)(?{print %"\$^N: '$^N'\n%"})"
正規表現は正しくマッチしているのにかかわらず、$^Nには何も入らず、Use of uninitialized value $^N
が出てます。元々、実験的な機能なので仕方ないといえば仕方ないのですが……。