정규식에서 $ /와 $ ¢의 차이점은 무엇입니까?


11

제목에서 알 수 있듯이, 차이 무엇 $/? 그들은 항상 같은 값을 가지고있는 것 같습니다 :

my $text = "Hello world";

$text ~~ /(\w+) { say $/.raku } (\w+)/;
$text ~~ /(\w+) { say $¢.raku } (\w+)/;

둘 다 동일한 값을 가진 일치 오브젝트를 생성합니다. 하나를 다른 것보다 사용하는 논리는 무엇입니까?

답변:


11

변수 $/는 가장 최근의 일치를 나타내며 변수 는 가장 최근의 일치를 나타냅니다. 위와 같은 대부분의 기본 정규 표현식에서는 하나와 같을 수 있습니다. 그러나 .raku메소드 의 출력에서 ​​볼 수 있듯이 Match객체는 다른 Match객체를 포함 할 수 있습니다 (사용 $<foo>하거나 $1캡처 할 때 얻는 것 ).

대신 우리는 정량화 된 캡처와 함께 다음 정규 표현식을 가지고 있다고 가정

/ ab (cd { say $¢.from, " ", $¢.to } ) + /

그리고 우리가 "abcdcdcd"와 일치하면 다음과 같은 결과를 볼 수 있습니다.

0 2
0 4
0 6

그러나를 사용에서 로 변경 $/하면 다른 결과가 나타납니다.

2 2
4 4
6 6

( .to비트 오프로 보이는 이유 .pos는 캡처 블록이 끝날 때까지 업데이트되지 않기 때문입니다.)

즉, 의지 항상 당신의 결승전 객체 (즉, 될 것입니다 무엇을 참조 $final = $text ~~ $regex그냥 수, 당신은 정확하게 정규식의 복잡한 캡처 트리 내부를 통과 할 수 있도록 한 후 위의 예에서 전체 경기 그래서 완료 한 것처럼) 할 $¢[0]첫 경기를 참조하는 $¢[1]두 번째 등

정규식 코드 블록 내부 $/에서 가장 직접적인 일치를 나타냅니다. 위의 경우 내부 ( )와 일치하며 다른 일치 또는 원래 일치 시작에 대해 알지 못합니다.( ) . 블록 . 더 복잡한 정규 표현식을 제공하십시오.

/ a $<foo>=(b $<bar>=(c)+ )+ d /

foo을 말하면 $ ¢ 모든 토큰을 사용하여 언제든지 액세스 할 수 있습니다 $¢<foo>. 를 사용하여 bar주어진 토큰에 액세스 할 수 있습니다 . 우리의 코드 블록 내부에 삽입하는 경우 의 캡처, 그것은 액세스 할 수있을 것입니다 사용하여 토큰 이나 ,하지만 액세스 다른 수 없습니다 들.foo$¢<foo>[0]<bar>foobar$<bar>$/<bar>foo


1
오! 나는 의사의 " 범위 의 주요 차이점 $/범위는 다음 과 같이 해석했다 . 후자는 정규 표현식 내부의 값만 가지고있다"는 의미 는 단지 흔적 흔적 일 뿐이다 Cursor. 당신의 대답을 읽을 때 나는 가능한 개선점 에서 내가 만든 것이라고 생각했습니다 . SO에 대한 나의 대답 섹션 "반복 된 임의의 캐릭터를 캡처 그룹과 일치시키는 데 왜 추가 변수가 필요한가?" 그러나 교체하려는 시도 는 실패했습니다. 그 대답에서 내 요점을 이해합니까? 작동시킬 수 있습니까? $*TOP$*TOP
raiph

Raiph이 : 그래서는 문법에, 당신이 말을해야 할 것, 그래서 각 토큰에 대한 갱신 $*TOP := $¢TOP토큰하지만이에 대한 필요성을 제거하지 않습니다 $*TOP물론 VAR. 나는 최고 수준에서 경기를 참조 할 수 있다는 것이 대단한 것에 동의합니다. 문제는 궁극적으로 여전히 식별하는 것입니다. 위치 / 해시 일치가 일치 개체에 게시 될 때입니다. 토큰 당 —을 사용할 때 결과는 둘러싸는 { }블록이 발생 하자마자 정의에 따라 게시됩니다 .
user0721090601

흥미로운 점은 개발 과정 Binex에서 일치하는 결과를 즉시 발견하는 것이 계산 상 더 나쁘지 않다는 것입니다. 하루가 끝나면 캐시 된 목록 / 해시로 푸시 / 팝핑하거나 경기의 목록 / 해시로 푸시 / 팝핑합니다. 그러나 LTM에 대해 잘 모르는 내부 속도 향상이있을 수 있습니다 ( { }LTM의 목적으로 토큰을 종료하므로 실행 / 테스트 될 가능성이 높습니다 |그룹화 의 나머지 토큰 )
user0721090601

아아 나는 역동적 이라는 결론 에 뛰어 들었고 그것이 작동하지 않을 때 놀랐습니다. 그러나 페니는 이제 "가장 바깥 쪽"이라는 단어를 사용했을 때 짐작할 수 있듯이 어휘 적이라는 말을 들었습니다.
raiph

따라서 iiuc는 규칙이 시작될 때 원래 입력 문자열 내에서 일치하는 엔진의 커서 위치를 기록하지만 그렇지 않은 경우 비어있는 새 일치 오브젝트가 작성됩니다. (오른쪽?) 다음 $/가 진행됨에 따라 규칙 일치 및 캡처 어떤이를 기록합니다 같은 객체, 즉이 새로운 일치 객체에 바인딩됩니다. 그런 다음 일치가 진행됨에 따라이 전체 일치 개체에 바인딩 된 상태로 유지되지만 $/새 일치 개체가 생성 될 때마다 리바운드되므로 항상 최신 일치 개체에 해당합니다. 권리?
raiph
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.