2017-09-14 6 views
3

정규 표현식 외부 정규화 표현식 <>은 작은 따옴표처럼 작동합니다. 배열 변수가 정규식 내에서 허용된다펄의 정규 표현식에서 <> 및 익명 배열의 특수한 의미 6

# Outside regex, <> acts like single quotes: 
> my $x = <{"one"}> 
{"one"} 
> $x.WHAT 
(Str) 

# Inside regex, <> evaluates and interpolates: 
> my $b="one"; 
one 
> say "zonez" ~~ m/ <{$b}>/# Evaluates {$b} then quotes: m/ one/
「one」 
> say "zonez" ~~ m/ <$b>/ # Interpolates and quotes without {} 
「one」 

때문에, 나는 펄   6 정규식 엔진이 배열을 소비하는 것으로 생각 : 내 얕은 이해는 정규 표현식 내부 <이> 코드의 평가 및 보간을 허용 말해 보인다 배열을 둘러싼 정규식 내부에 <이있을 때 OR로 변환합니다.

또한 사용자 정의 문자 클래스 < []>에서 < 배열의 배열은 익명의 배열과 비슷한 방식으로 작동하며 아래의 @a와 유사합니다. 배열 (문자 클래스의 문자)은 OR에 소비됩니다.

my @a = $b, "two"; 
[one two] 
> so "zonez" ~~ m/ @a /; 
True 
> say "ztwoz" ~~ m/ <{[$b, "two"]}>/# {} to eval array, then <> quotes 
「two」 
> say "ztwoz" ~~ m/ <{@a}>/
「two」 
> say "ztwoz" ~~ m/ <@a>/
「two」 
> say "ztwoz" ~~ m/ one || two/# expands @a into ORs: [||] @a; 
# [||] is a reduction operator; 
「two」 

그리고 문자 클래스 확장 :

> say "ztwoz" ~~ m/ <[onetw]>/# like [||] [<o n e t w>]; 
「t」 
> say "ztwoz" ~~ m/ o|n|e|t|w/
「t」 
> my @m = < o n e t w > 
[o n e t w] 
> say "ztwoz" ~~ m/ @m/
「t」 

나는 Rakudo 소스 코드에보고하지 않은, 나의 이해는 제한됩니다. 나는 <> 실제로 정규 표현식 내부에 배열을 구성한다는 것을 증명하기 위해 정규 표현식 내부에 익명 배열을 만들지 못했습니다.

그렇다면 <> 정규식 내부에 특별한 것이 있습니까? 아니면 내가 Rakudo 소스 코드를 연구해야합니까? (나는 현재이 때하지 않으려 고합니다)?

답변

3

<> 외부는 과 같은 역할을합니다. 즉, 공백을 따옴표로 묶고 나눕니다.

say <a b c>.perl; 
# ("a", "b", "c") 

그것은이 여기에서 논의 될 수있는 것보다 더 광범위한 주제이기 때문에 내가 Language: Quoting Constructs을 읽어 보시기 바랍니다

q :w 'a b c' 

Q :q :w 'a b c' 

Q :single :words 'a b c' 

로 확장 할 수 있습니다.

이것은 <>이 정규식의 내부에서 수행하는 것과 거의 관계가 없습니다.

regexes에서 <>을 사용하면 기본 Perl 6 코드에서 유용하지 않으며 qw은 정규식에서 유용하지 않습니다. 그래서이 문자들은 이중 의무를 수행합니다. 주로 ASCII에 비 문자와 숫자가 아닌 문자가 거의 없기 때문입니다. < 바로 뒤에 오는 문자가 공백 문자 인 경우에만 qw처럼 작동합니다. 이 정규 표현식에 일부 코드를 주입하는 것으로 생각 될 수있는 내부의 정규식


; 매크로 같은 종류 또는 함수 호출.

/<{ split ';', 'a;b;c' }>/; 
/[ "a" | "b" | "c" ] /; 

(|| 다음 한 다음 먼저 가장 왼쪽에 하나, 등 기본적으로 ||있는 방법 | 펄 5와 PCRE에서와 작동을 시도하는 동안 그 | 시도를 모두 동시에 교대를합니다.)

/<:Ll - [abc]>/ 
/[d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z]/# plus other lowercase letters 
/ @a /도 동일한 구조로 용해하는 것으로
/ <@a>/
/[ "one" | "two" ]/

.

/ <?{ 1 == 0 }>/

# try to match a character after the end of the string 
# (can never succeed) 
/[ $ : . ]/

그 마지막 두

/ <?{ 1 > 0 }>/

# null regex always succeeds 
/[ '' ]/

은 매우 정확하지 않습니다,하지만 그것에 대해 생각하는 유용한 방법이 될 수 있습니다.


또한 정규식 "메소드"를 호출하는 데 사용됩니다.

grammar Foo { 
    token TOP { <alpha> } # calls Grammar.alpha and uses it at that point 
} 

당신은 항상 독립적 인 하위 표현 같은 역할로 항상 []로 대체 둘러싸여 발견합니다.

기술적으로 이들 중 어느 것도 내가 제시 한 방식으로 구현되지 않았습니다. 이론적으로 설명하기 쉬운 모델 일뿐입니다.

+0

대단히 Brad Gilbert 님, 감사합니다. <{}> 정말 멋지다 !!> say "zzonezz"~~ m/<("foo"라고 말하십시오. "하나";}>/ foo는 foo는 단지 – lisprogtor

+1

perl6 foo는 '<>'당신이 <''뒤에 공백을 넣을 때, 정규 표현식에 내부 qw''와 같은 역할을 할 수 있습니다. 예 :'/ < a b c> /' – lisprogtor

+0

:-) 더 나은 일상을 얻는다 「하나」 – CIAvash

2

정규 표현식 <> 내에서 "일반화 된 어설 션"이라고하는 경향이 있습니다. 정규식과 무언가를 매치 할 때마다 문자열이 어떻게 보이는지에 대한 일련의 주장을하고 있습니다. 모든 어설 션이 참이면 전체 정규식이 일치합니다. 예를 들어, / foo /은 "foo"문자열이 일치하는 문자열 내에 표시된다고 주장합니다. / f o* /은 문자열에 "f"다음에 "0"이상의 "o"등이 있어야 함을 나타냅니다.

어쨌든 일반화 된 어설 션의 경우 Rakudo Perl 6은 < 다음의 문자를 사용하여 어떤 종류의 어설 션 되고있다. < 다음의 문자가 영문자 (예 : <foo>) 인 경우 명명 된 하위 규칙을 의미하는 것으로 간주됩니다. < 이후의 문자가 { 인 경우 패턴에 보간 될 코드가 포함 된 어설 션 (예 : <{ gen_some_regex(); }>)입니다. < 이후의 문자가 [이면 문자 클래스입니다. < 이후의 문자가 :이면 유니 코드 속성 (예 : <:Letter>)과 일치해야합니다. < 다음의 문자가 ? 또는 !이면 0과 -1의 양수인 어설 션을 각각받습니다.

마지막으로 정규 표현식 외부에서 <>은 "따옴표 단어"의 역할을합니다. 바로 < 다음과 같은 문자가 공백 문자 인 경우, 정규 표현식 내에서, 또한 "인용 단어"일종의 역할을합니다 : 그것은 교대 것처럼

> "I'm a bartender" ~~/< foo bar >/
「bar」 

이 일치, 즉 < foo bar >이 일치하는 것이다 foo 또는 bar 중 하나 (예 : foo | bar)

+0

감사합니다. perlpilot !! 귀하의 설명 정말 도움이! – lisprogtor