이것은 Ubuntu Online, Fedora Online, Windows 온라인 에뮬레이터 또는 MAC OS 온라인 에뮬레이터와 같은 여러 무료 온라인 워크스테이션 중 하나를 사용하여 OnWorks 무료 호스팅 공급자에서 실행할 수 있는 perlreapi 명령입니다.
프로그램:
이름
perlreapi - Perl 정규식 플러그인 인터페이스
기술
Perl 5.9.5부터는 정규식을 연결하고 사용하기 위한 새로운 인터페이스가 있습니다.
기본 엔진이 아닌 다른 엔진.
각 엔진은 다음 형식의 상수 구조에 대한 액세스를 제공해야 합니다.
typedef 구조체 regexp_engine {
REGEXP* (*comp) (pTHX_
const SV * const 패턴, const U32 플래그);
I32 (*실행) (pTHX_
REGEXP * const rx,
char* 문자열인수,
char* strend, char* strbeg,
SSize_t minend, SV* sv,
무효* 데이터, U32 플래그);
char* (*직관) (pTHX_
REGEXP * const rx, SV *sv,
const char * const strbeg,
char *strpos, char *strend, U32 플래그,
구조체 re_scream_pos_data_s *data);
SV*(*checkstr)(pTHX_ REGEXP * const rx);
무효(*무료)(pTHX_ REGEXP * const rx);
무효 (*numbered_buff_FETCH) (pTHX_
REGEXP * const rx,
const I32 파렌,
SV * const sv);
무효 (*numbered_buff_STORE) (pTHX_
REGEXP * const rx,
const I32 파렌,
SV const * const 값);
I32 (*numbered_buff_LENGTH) (pTHX_
REGEXP * const rx,
const SV * const sv,
const I32 괄호);
SV* (*named_buff) (pTHX_
REGEXP * const rx,
SV * const 키,
SV * const 값,
U32 플래그);
SV* (*named_buff_iter) (pTHX_
REGEXP * const rx,
const SV * const 마지막 키,
const U32 플래그);
SV* (*qr_package)(pTHX_ REGEXP * const rx);
#ifdef USE_ITHREADS
void* (*dupe) (pTHX_ REGEXP * const rx, CLONE_PARAMS *param);
#endif
REGEXP* (*op_comp) (...);
정규식을 컴파일하면 "엔진" 필드가 적절한 위치를 가리키도록 설정됩니다.
구조를 사용하여 Perl이 사용해야 할 때 올바른 루틴을 찾을 수 있도록 합니다.
새로운 정규식 처리기를 설치하기 위해 $^H{regcomp}는 정수로 설정됩니다.
적절하게 캐스팅됨)은 이러한 구조 중 하나로 해결됩니다. 컴파일할 때 "comp"
메소드가 실행되고 결과 "regexp" 구조의 엔진 필드는
동일한 구조를 다시 지적합니다.
정의에 있는 pTHX_ 기호는 Perl이 스레딩에서 다음을 제공하기 위해 사용하는 매크로입니다.
실행 중인 인터프리터에 대한 포인터를 다시 보유하는 루틴에 대한 추가 인수
정규식. 따라서 스레딩 시 모든 루틴은 추가 인수를 얻습니다.
콜백
완
REGEXP* comp(pTHX_ const SV * const 패턴, const U32 플래그);
주어진 "플래그"를 사용하여 "pattern"에 저장된 패턴을 컴파일하고 포인터를 반환합니다.
일치를 수행할 수 있는 "REGEXP" 구조를 준비했습니다. 아래의 "REGEXP 구조"를 참조하세요.
REGEXP 구조체의 개별 필드에 대한 설명은
"pattern" 매개변수는 패턴으로 사용된 스칼라입니다. 이전 버전
Perl은 문자열화된 패턴의 시작과 끝을 나타내는 두 개의 "char*"를 전달합니다. 그만큼
다음 코드 조각을 사용하여 이전 매개변수를 가져올 수 있습니다.
STRLEN plen;
char* exp = SvPV(패턴, plen);
char* xend = exp + plen;
어떤 스칼라라도 패턴으로 전달될 수 있으므로 다음과 같은 엔진을 구현하는 것이 가능합니다.
배열(""ook" =~ [ qw/ eek hlagh / ]") 또는 문자열이 아닌 문자열로 작업을 수행합니다.
컴파일된 정규 표현식의 형식(""ook" =~ qr/eek/"). Perl의 자체 엔진은 항상
위의 스니펫을 사용하여 모든 것을 문자열화하지만 다른 엔진이 그렇게 해야 한다는 의미는 아닙니다.
"flags" 매개변수는 "msixpn" 중 어느 것이 정규식에 플래그를 지정하는지 나타내는 비트필드입니다.
로 컴파일되었습니다. 또한 "로케일 사용"이 있는지와 같은 추가 정보가 포함되어 있습니다.
효과.
"eogc" 플래그는 comp 루틴으로 전달되기 전에 제거됩니다. 정규식
엔진은 이러한 플래그가 설정되어 있는지 여부를 알 필요가 없습니다. 해당 플래그는
Perl이 패턴과 일치 변수를 사용하여 수행하는 작업이 아니라 컴파일 및 실행 방법이 아닙니다.
실행.
comp 콜백이 호출될 때 이러한 플래그 중 일부는 이미 적용되었습니다.
(해당하는 경우 아래에 명시됨). 그러나 대부분의 효과는 보상 후에 발생합니다.
콜백이 채워지는 "rx->extflags" 필드를 읽는 루틴에서 실행되었습니다.
일반적으로 플래그는 컴파일 후에 "rx->extflags"에 보존되어야 합니다.
정규식 엔진은 일부 특수 기능을 호출하거나 비활성화하기 위해 일부를 추가하거나 삭제하려고 할 수 있습니다.
Perl에서의 동작. 플래그와 그에 따른 특별한 동작이 문서화되어 있습니다.
아래 :
패턴 수정자:
"/m" - RXf_PMf_MULTILINE
이것이 "rx->extflags"에 있으면 "pp_split"에 의해 "Perl_fbm_instr"로 전달됩니다.
제목 문자열을 여러 줄 문자열로 처리합니다.
"/s" - RXf_PMf_SINGLELINE
"/i" - RXf_PMf_FOLD
"/x" - RXf_PMf_EXTENDED
정규식에 있는 경우 "#" 주석은 토크나이저에서 다르게 처리됩니다.
일부 경우.
TODO: 해당 사례를 문서화합니다.
"/p" - RXf_PMf_KEEPCOPY
TODO: 이것을 문서화하세요
문자 세트
문자 세트 규칙은 이 필드에 포함된 열거형에 의해 결정됩니다.
이는 아직 실험적이며 변경될 수 있지만 현재 인터페이스는
인라인 함수 "get_regex_charset(const U32 flags)"를 사용하여 규칙을 적용합니다. 그만큼
현재 문서화된 값만 반환되어 REGEX_LOCALE_CHARSET으로 설정되어 있습니다.
"로케일 사용"이 유효한 경우. "rx->extflags"에 있는 경우 "split"은
RXf_SKIPWHITE 또는 RXf_WHITE가 있는 경우 공백의 로케일 종속 정의
효과. ASCII 공백은 isSPACE에 따라 정의되며 내부 매크로에 의해 정의됩니다.
UTF-8에서는 "is_utf8_space", "로케일 사용"에서는 "isSPACE_LC"입니다.
추가 플래그:
RXf_SPLIT
이 플래그는 perl 5.18.0에서 제거되었습니다. "split ' '"은 이제
파서. RXf_SPLIT는 여전히 #정의되어 있으므로 테스트할 수 있습니다. 예전엔 이런 식이었지
일 :
"split"이 "split ' '"로 호출되거나 인수 없이 호출되는 경우(실제로는 "split('
', $_)", 분할 참조), Perl은 이 플래그를 설정합니다. 그러면 정규식 엔진이 이를 확인할 수 있습니다.
SKIPWHITE 및 WHITE extflags를 설정합니다. 이를 위해 Perl 엔진은 다음을 수행합니다.
if (플래그 & RXf_SPLIT && r->prelen == 1 && r->precomp[0] == ' ')
r->extflags |= (RXf_SKIPWHITE|RXf_WHITE);
이러한 플래그는 "분할" 연산자에서 최적화를 활성화하기 위해 컴파일 중에 설정할 수 있습니다.
RXf_SKIPWHITE
이 플래그는 Perl 5.18.0에서 제거되었습니다. 아직은 #정의되어 있어서 설정이 가능하지만
그렇게 하면 효과가 없습니다. 이전에는 다음과 같이 작동했습니다.
플래그가 "rx->extflags"에 있으면 "split"은 처음부터 공백을 삭제합니다.
대상 문자열이 작동되기 전의 문자열입니다. 공백으로 간주되는 사항은 다음과 같습니다.
제목이 UTF-8 문자열이고 "RXf_PMf_LOCALE" 플래그가 설정된 경우 on입니다.
이 플래그 외에 RXf_WHITE가 설정되면 "split"은 "split " ""처럼 동작합니다.
Perl 엔진에서.
RXf_START_ONLY
분할 연산자에게 대상 문자열을 줄 바꿈("\n") 없이 분할하도록 지시합니다.
정규식 엔진을 호출합니다.
Perl의 엔진은 패턴이 "/^/"("plen == 1 && *exp == '^'")이면 이를 설정합니다.
"/^/s" 아래; 분할을 참조하십시오. 물론 다른 정규식 엔진이
다른 구문으로 동일한 최적화.
RXf_WHITE
분할 연산자를 호출하지 않고 공백에서 대상 문자열을 분할하도록 지시합니다.
정규식 엔진. 공백의 정의는 대상 문자열이
UTF-8 문자열이며 RXf_PMf_LOCALE이 설정된 경우 켜집니다.
Perl의 엔진은 패턴이 "\s+"인 경우 이 플래그를 설정합니다.
RXf_NULL
문자에서 대상 문자열을 분할하도록 분할 연산자에 지시합니다. 의 정의
문자는 대상 문자열이 UTF-8 문자열인지 여부에 따라 다릅니다.
Perl의 엔진은 빈 패턴에 이 플래그를 설정합니다. 이 최적화는 "분할 //"을 만듭니다.
그렇지 않은 경우보다 훨씬 빠릅니다. "압축해제"보다 훨씬 빠릅니다.
RXf_NO_INPLACE_SUBST
Perl 5.18.0에 추가된 이 플래그는 정규식이 다음을 수행할 수 있음을 나타냅니다.
제자리 대체를 방해하는 작업. 예를 들어
lookbehind를 포함하거나 마법이 아닌 변수(예: $REGMARK 및
$REGERROR) 일치 중입니다. "s///"는 이것이 설정되면 특정 최적화를 건너뜁니다.
임원
I32 exec(pTHX_ REGEXP * const rx,
char *stringarg, char* strend, char* strbeg,
SSize_t minend, SV* sv,
무효* 데이터, U32 플래그);
정규식을 실행합니다. 인수는
rx 실행할 정규식입니다.
sv 일치시킬 SV입니다. 일치시킬 실제 문자 배열에 유의하십시오.
against는 아래에 설명된 인수로 제공됩니다. SV는 단지 결정하는 데 사용됩니다.
UTF8ness, "pos()" 등
스트베그
문자열의 물리적 시작에 대한 포인터입니다.
경향
문자열의 물리적 끝 뒤에 오는 문자(예: "\0")에 대한 포인터
어느).
문자열 인수
일치가 시작되어야 하는 문자열의 위치에 대한 포인터입니다. 아닐 수도 있습니다
"strbeg"와 동일합니다(예: "/.../g"의 이후 반복에서).
광산
일치해야 하는 문자열의 최소 길이("stringarg"의 바이트로 측정됨). 만약에
엔진이 경기 끝에 도달했지만 스트링의 이 위치에 도달하지 않은 경우
실패해야합니다.
데이터
최적화 데이터 변경될 수 있습니다.
플래그
최적화 플래그 변경될 수 있습니다.
인튜이트의
char* 직관(pTHX_
REGEXP * const rx,
SV *sv,
const char * const strbeg,
문자 *strpos,
char *strend,
const U32 플래그,
구조체 re_scream_pos_data_s *data);
정규식 일치를 시도해야 하는 시작 위치를 찾거나 정규식이
패턴이 일치하지 않으므로 엔진을 실행하면 안 됩니다. 이것은 적절하게 호출됩니다.
"regexp" 구조의 "extflags" 멤버 값에 따라 코어별로.
인수 :
rx: 일치시킬 정규식
sv: 일치하는 SV: utf8 플래그에만 사용됩니다. 문자열
자체는 아래 포인터를 통해 액세스됩니다. 참고하세요
과부하된 SV와 같은 것, SvPOK(sv)는 거짓일 수 있습니다.
문자열 포인터는 관련되지 않은 것을 가리킬 수 있습니다.
SV 그 자체.
strbeg: 문자열의 실제 시작
strpos: 일치를 시작할 문자열의 지점
strend: 문자열의 마지막 문자 다음에 오는 바이트에 대한 포인터
현재 사용되지 않는 플래그; 0으로 설정
데이터: 현재 사용되지 않음; NULL로 설정
체크스트
SV* checkstr(pTHX_ REGEXP * const rx);
패턴에 나타나야 하는 문자열이 포함된 SV를 반환합니다. "분할"에 사용됨
경기 최적화.
비어 있는
void free(pTHX_ REGEXP * const rx);
엔진이 정규 표현식 패턴을 해제할 때 Perl에 의해 호출됩니다.
"regexp" 구조의 "pprivate" 멤버가 가리키는 리소스입니다. 이것은 단지
개인 데이터를 공개할 책임이 있습니다. Perl은 포함된 다른 모든 항목의 릴리스를 처리합니다.
"regexp" 구조에서.
번호가 매겨진 포착 콜백
"$`", "$'", $& 및 명명된 해당 항목인 ${^PREMATCH}의 값을 가져오거나 설정하기 위해 호출됩니다.
${^POSTMATCH} 및 ${^MATCH}와 번호가 매겨진 캡처 그룹($1, $2, ...).
"paren" 매개변수는 $1의 경우 1, $2의 경우 2 등이며 이러한 기호를 갖습니다.
특수 변수의 값:
${^PREMATCH} RX_BUFF_IDX_CARET_PREMATCH
${^POSTMATCH} RX_BUFF_IDX_CARET_POSTMATCH
${^MATCH} RX_BUFF_IDX_CARET_FULLMATCH
$` RX_BUFF_IDX_PREMATCH
$' RX_BUFF_IDX_POSTMATCH
$& RX_BUFF_IDX_FULLMATCH
Perl 5.17.3 및 이전 버전에서는 마지막 세 상수도
변수의 캐럿 변형.
이름은 Tie::Scalar 메소드 이름과 유사하게 추가로 선택되었습니다.
LENGTH 효율성을 위한 콜백. 그러나 명명된 캡처 변수는 현재 연결되어 있지 않습니다.
내부적으로는 마법을 통해 구현됩니다.
numbered_buff_FETCH
void numbered_buff_FETCH(pTHX_ REGEXP * const rx, const I32 paren,
SV * const sv);
지정된 번호가 붙은 캡처를 가져옵니다. "sv"는 반환할 스칼라로 설정되어야 합니다.
스칼라는 함수에서 반환되지 않고 인수로 전달됩니다.
Perl은 이미 값을 저장할 스칼라를 가지고 있으므로 다른 값을 생성하는 것은
불필요한. 스칼라는 "sv_setsv", "sv_setpvn" 및 그 친구들을 사용하여 설정할 수 있습니다. perlapi를 참조하세요.
이 콜백은 Perl이 오염 모드에서 자체 캡처 변수를 오염시키지 않는 곳입니다(참조:
펄섹). "Perl_reg_numbered_buff_fetch" 함수를 참조하십시오. regcomp.c 오염을 제거하는 방법에 대해
엔진이 원하는 작업인 경우 변수를 캡처합니다.
numbered_buff_STORE
무효 (*numbered_buff_STORE) (pTHX_
REGEXP * const rx,
const I32 파렌,
SV const * const 값);
번호가 매겨진 캡처 변수의 값을 설정합니다. "값"은 다음과 같이 사용될 스칼라입니다.
새로운 가치. 이것이 새로운 값(또는
거부).
예:
if ("ook" =~ /(o*)/) {
# '괄호'는 '1'이 되고 '값'은 'ee'가 됩니다.
$1 =~ tr/o/e/;
}
Perl의 자체 엔진은 캡처 변수를 수정하려는 모든 시도에서 삐걱거릴 것입니다.
다른 엔진은 다음 콜백을 사용합니다("Perl_reg_numbered_buff_store"에서 복사됨).
무효화
예_reg_numbered_buff_store(pTHX_
REGEXP * const rx,
const I32 파렌,
SV const * const 값)
{
PERL_UNUSED_ARG(rx);
PERL_UNUSED_ARG(부모);
PERL_UNUSED_ARG(값);
if (!PL_localizing)
Perl_croak(aTHX_PL_no_modify);
}
실제로 Perl은 그렇지 않습니다. 항상 뭔가를 바꿀 것 같은 말을 하다가
번호가 매겨진 캡처 변수. 이는 Perl이 다음과 같은 경우 STORE 콜백이 호출되지 않기 때문입니다.
값을 수정할 필요가 없다고 판단할 수 있습니다. 바로 이렇게 묶인다
변수는 동일한 상황에서 작동합니다.
패키지 CaptureVar;
상위 'Tie::Scalar'를 사용합니다.
하위 TIESCALAR { 축복 [] }
서브 FETCH { undef }
sub STORE { 다이 "이것은 호출되지 않습니다" }
패키지 메인;
내 $sv => "CaptureVar" 연결;
$sv =~ y/a/b/;
$sv는 "y///" 연산자가 적용될 때 "undef"이므로 음역은
실제로 실행되지 않고 프로그램이 "죽지" 않습니다. 이것은 5.8 및
이전 버전은 캡처 변수가 READONLY 변수였기 때문에 동작했습니다. 지금
기본 엔진에 할당되면 그냥 죽습니다.
numbered_buff_LENGTH
I32 numbered_buff_LENGTH(pTHX_
REGEXP * const rx,
const SV * const sv,
const I32 괄호);
캡처 변수의 "길이"를 가져옵니다. Perl이 이를 수행할 수 있도록 하는 특별한 콜백이 있습니다.
FETCH를 수행하고 결과에 대해 "length"를 실행할 필요가 없습니다. 왜냐하면 길이는 (Perl의 경우)
경우) "rx->offs"에 저장된 오프셋에서 알려진 경우 이는 훨씬 더 효율적입니다.
I32 s1 = rx->offs[괄호].start;
I32 s2 = rx->offs[paren].end;
I32 길이 = t1 - s1;
UTF-8의 경우에는 조금 더 복잡합니다.
"Perl_reg_numbered_buff_length"는 is_utf8_string_loclen을 사용합니다.
이름 포착 콜백
"%+" 및 "%-"의 값을 가져오거나 설정하기 위해 호출되며 re의 일부 유틸리티 함수에 의해 호출됩니다.
두 가지 콜백이 있는데, "named_buff"는 FETCH, STORE, DELETE,
CLEAR, EXISTS 및 SCALAR Tie::Hash 콜백은 "%+" 및 "%-"에 대한 변경 사항에 적용됩니다.
FIRSTKEY 및 NEXTKEY와 동일한 경우 "named_buff_iter"입니다.
"flags" 매개변수를 사용하여 이러한 작업 중 콜백이 수행되는 작업을 결정할 수 있습니다.
에 응답해야 합니다. 현재 정의된 플래그는 다음과 같습니다.
어떤 Tie::Hash 작업이 "%+" 또는 "%+"에서 Perl 수준에서 수행되고 있는지(있는 경우):
RXapif_FETCH
RXapif_STORE
RXapif_DELETE
RXapif_CLEAR
RXapif_EXISTS
RXapif_SCALAR
RXapif_FIRSTKEY
RXapif_NEXTKEY
"%+" 또는 "%-"가 연산되고 있는 경우.
RXapif_ONE /* %+ */
RXapif_ALL /* %- */
이것이 "re::regname", "re::regnames" 또는 "re::regnames_count"로 호출되는 경우(있는 경우)
처음 두 개는 "RXapif_ONE" 또는 "RXapif_ALL"과 결합됩니다.
RXapif_REGNAME
RXapif_REGNAMES
RXapif_REGNAMES_COUNT
내부적으로 "%+" 및 "%-"는 다음을 통해 실제 연결된 인터페이스로 구현됩니다.
타이::해시::NamedCapture. 해당 패키지의 메서드는 이러한 함수를 다시 호출합니다.
그러나 이 목적을 위한 Tie::Hash::NamedCapture의 사용법은 향후 변경될 수 있습니다.
릴리스. 예를 들어 이것은 대신 마술로 구현될 수 있습니다(
mgvtbl로 확장).
명명된_버프
SV* (*named_buff) (pTHX_ REGEXP * const rx, SV * const 키,
SV * const 값, U32 플래그);
명명된_버프_iter
SV* (*named_buff_iter) (pTHX_
REGEXP * const rx,
const SV * const 마지막 키,
const U32 플래그);
qr_패키지
SV* qr_package(pTHX_ REGEXP * const rx);
qr// 매직 오브젝트가 포함된 패키지("ref qr//"로 표시됨). 그것은
상관없이 식별을 위해 엔진이 이를 패키지 이름으로 변경할 것을 권장했습니다.
객체에 메소드를 구현하는지 여부.
이 메서드가 반환하는 패키지에는 내부 "Regexp" 패키지도 있어야 합니다.
@ISA. "qr//->isa("Regexp")"는 어떤 엔진이 사용되는지에 관계없이 항상 true여야 합니다.
익숙한.
구현 예는 다음과 같습니다.
SV*
예_qr_package(pTHX_ REGEXP * const rx)
{
PERL_UNUSED_ARG(rx);
return newSVpvs("re::engine::Example");
}
"qr//"로 생성된 객체에 대한 모든 메서드 호출은 패키지에 다음과 같이 전달됩니다.
정상적인 개체.
re::engine::Example을 사용하세요.
내 $re = qr//;
$re->메트; # re::engine::Example::meth()로 전달됩니다.
XS 함수의 스칼라에서 "REGEXP" 개체를 검색하려면 "SvRX" 매크로를 사용합니다.
perlapi의 "REGEXP 함수"를 참조하십시오.
무효 메스(SV * rv)
PP코드:
REGEXP * re = SvRX(sv);
잘 속는 사람
void* dupe(pTHX_ REGEXP * const rx, CLONE_PARAMS *param);
스레드 빌드에서는 패턴을 사용할 수 있도록 정규 표현식을 복제해야 할 수도 있습니다.
다중 스레드. 이 루틴은 모든 개인 데이터의 중복을 처리할 것으로 예상됩니다.
"regexp" 구조의 "pprivate" 멤버에 의해 지정됩니다. 다음과 같이 호출됩니다.
새로운 "regexp" 구조를 인수로 미리 구성한 경우 "pprivate" 멤버는 다음을 가리킬 것입니다.
전에, 낡은 비공개 구조이며 복사본을 생성하고
그것에 대한 포인터를 반환합니다(Perl은 이 필드에 전달된 대로 필드를 덮어쓰는 데 사용할 것입니다)
루틴.)
이를 통해 엔진은 개인 데이터를 복제할 수 있지만 필요한 경우 최종 데이터를 수정할 수도 있습니다.
정말로 필요한 경우 구조.
스레드되지 않은 빌드에서는 이 필드가 존재하지 않습니다.
op_comp
이는 Perl 코어에만 적용되며 변경될 수 있습니다. null로 남겨두어야 합니다.
이 어플리케이션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 REGEXP 구조
REGEXP 구조체는 다음에 정의되어 있습니다. 정규식.h. 모든 정규식 엔진은 올바르게 작동할 수 있어야 합니다.
"comp" 루틴에서 이러한 구조를 구축합니다.
REGEXP 구조에는 Perl이 제대로 작동하기 위해 알아야 하는 모든 데이터가 포함되어 있습니다.
정규식으로. 여기에는 Perl이 사용할 수 있는 최적화에 대한 데이터가 포함되어 있습니다.
정규식 엔진을 실제로 사용해야 하는지 여부와 그 밖의 다양한 제어 정보를 결정합니다.
패턴이 다음과 같이 다양한 컨텍스트에서 패턴을 올바르게 실행하는 데 필요합니다.
어떤 방식으로 고정되었는지, 컴파일 중에 어떤 플래그가 사용되었는지, 프로그램이
Perl이 알아야 할 특별한 구성이 포함되어 있습니다.
또한 정규식을 개인적으로 사용하기 위한 두 개의 필드가 포함되어 있습니다.
패턴을 컴파일한 엔진. 이는 "intflags" 및 "pprivate" 멤버입니다.
"pprivate"은 임의의 구조에 대한 무효 포인터이며, 그 사용 및 관리는
컴파일 엔진의 책임. Perl은 이러한 값을 수정하지 않습니다.
typedef 구조체 정규식 {
/* 이 정규 표현식을 만든 엔진은 무엇입니까? */
const struct regexp_engine* 엔진;
/* 이것은 경량 복사본의 무엇입니까? */
구조체 정규식* mother_re;
/* Perl 코어가 관리하기 위해 사용하는 일치에 대한 정보
* 것들 */
U32 외부 플래그; /* 외부와 내부 모두에서 사용되는 플래그 */
I32 minlen; /* 가능한 최소 문자 수 */
일치시킬 문자열 */
I32 minlenret; /* $&에 가능한 최소 문자 수 */
U32 고프; /* 검색한 pos의 왼쪽 문자 */
/* 나타나야 하는 문자열에 대한 하위 문자열 데이터
최종 경기에서 최적화에 사용됨 */
구조체 reg_substr_data *substrs;
U32 nparens; /* 캡처 그룹 수 */
/* 프라이빗 엔진 특정 데이터 */
U32 intflags; /* 엔진별 내부 플래그 */
무효 *개인; /* 데이터는 정규식 엔진에 비공개입니다.
이 개체를 만들었습니다. */
/* 마지막/현재 경기에 대한 데이터. 이들은 동안 수정됩니다.
* 매칭*/
U32 라스트파렌; /* 일치하는 가장 근접한 괄호($+) */
U32 lastcloseparen; /* 일치하는 마지막 닫기 괄호($^N) */
regexp_paren_pair *스왑; /* *offs의 복사본 교환 */
regexp_paren_pair *offs; /* (@-) 및 오프셋 배열
(@+) */
char *subbeg; /* \digit가 작동하도록 저장된 또는 원래 문자열
영원히. */
SV_SAVED_COPY /* NULL이 아닌 경우 원본의 COW인 SV */
I32 서브렌; /* subbeg이 가리키는 문자열의 길이 */
I32 하위 오프셋; /* 논리적 시작부터 subbeg의 바이트 오프셋
문자열 */
I32 하위 오프셋; /* 하위 오프셋은 동일하지만 문자로 표시됩니다(@-/@+의 경우) */
/* 자주 사용되지 않는 일치에 대한 정보 */
I32 프레렌; /* 사전 구성 길이 */
const char *precomp; /* 사전 컴파일 정규식 */
숯 *포장; /* 패턴의 래핑된 버전 */
I32 랩렌; /* 포장된 길이 */
I32 seen_eval; /* 패턴의 평가 그룹 수 - for
보안 검사 */
HV *paren_names; /* 괄호 이름의 선택적 해시 */
/* 이 정규식의 참조 */
I32 참조; /* 이 정규식의 참조 횟수 */
} 정규식;
필드는 아래에서 자세히 설명합니다.
"엔진"
이 필드는 다음에 대한 포인터를 포함하는 "regexp_engine" 구조를 가리킵니다.
일치를 수행하는 데 사용되는 서브루틴. 컴파일 루틴이다.
정규식 개체를 반환하기 전에 이 필드를 채우는 것은 사용자의 책임입니다.
$^H{regcomp}에 사용자 정의 엔진이 지정되어 있지 않으면 내부적으로 이는 "NULL"로 설정됩니다.
Perl의 자체 콜백 세트는 "RE_ENGINE_PTR"이 가리키는 구조체에서 액세스할 수 있습니다.
"어머니_재"
TODO, 참조http://www.mail-archive.com/perl5-changes@perl.org/msg17328.html>
"extflags"
이것은 Perl에서 정규 표현식이 어떤 플래그로 컴파일되었는지 확인하는 데 사용됩니다.
일반적으로 comp 콜백에 의해 flags 매개변수의 값으로 설정됩니다. 광고 보기
유효한 플래그에 대한 문서입니다.
"민렌" "민렌레트"
일치하는 패턴에 필요한 최소 문자열 길이(문자)입니다. 이것은 사용됩니다
보다 문자열의 끝에 더 가깝게 일치하지 않도록 하여 검색 공간을 정리합니다.
일치를 허용합니다. 예를 들어 다음과 같은 경우 정규식 엔진을 시작해도 소용이 없습니다.
minlen은 10이지만 문자열 길이는 5자에 불과합니다. 그럴 리가 없습니다.
패턴이 일치할 수 있습니다.
"minlenret"은 $&에서 찾을 수 있는 문자열의 최소 길이(문자)입니다.
경기 후.
"minlen"과 "minlenret"의 차이점은 다음 패턴에서 확인할 수 있습니다.
/ns(?=\d)/
여기서 "minlen"은 3이지만 "minlenret"은 2입니다.
일치하지만 실제로는 일치하는 콘텐츠에 포함되지 않습니다. 이 구별은
대체 논리가 "minlenret"을 사용하여 할 수 있는지 알려주기 때문에 특히 중요합니다.
내부 대체(상당한 속도 향상을 가져올 수 있음).
"고프스"
왼쪽 오프셋 위치() 경기 시작 시간:
"하위 문자열"
최종 일치에 나타나야 하는 문자열에 대한 하위 문자열 데이터입니다. 현재는 이것뿐이다
Perl 엔진에서 내부적으로 사용되지만 향후 모든 엔진에서 사용될 수 있습니다.
최적화.
"nparens", "마지막", and "마지막 닫기파렌"
이 필드는 일치할 수 있는 파렌 그룹 수를 추적하는 데 사용됩니다.
입력된 마지막 열린 괄호이자 마지막 닫은 괄호인 패턴
입력합니다.
"인트플래그"
패턴이 컴파일된 플래그에 대한 엔진의 비공개 복사본입니다. 일반적으로 이것은
엔진이 그 중 하나를 수정하도록 선택하지 않는 한 "extflags"와 동일합니다.
"비공개"
엔진 정의 데이터 구조를 가리키는 void*. Perl 엔진은 다음을 사용합니다.
"regexp_internal" 구조(perlreguts의 "기본 구조" 참조) 그러나 사용자 정의 엔진
다른 것을 사용해야합니다.
"교환"
미사용. Perl 5.10.0과의 호환성을 위해 남겨두었습니다.
"오프"
일치하는 문자열에 대한 오프셋을 정의하는 "regexp_paren_pair" 구조
$& 및 $1, $2 등의 캡처에 해당하며 "regexp_paren_pair" 구조체가 정의됩니다.
다음과 같이 :
typedef 구조체 regexp_paren_pair {
I32 시작;
I32 끝;
} regexp_paren_pair;
"->offs[num].start" 또는 "->offs[num].end"가 "-1"이면 해당 캡처 그룹이 일치하지 않는 것입니다.
"->offs[0].start/end"는 $&(또는 "//p" 아래의 "${^MATCH}") 및 "->offs[paren].end"를 나타냅니다.
$paren = 1>인 경우 $$paren과 일치합니다.
"사전 구성" "프렌렌"
최적화에 사용됩니다. "precomp"는 컴파일된 패턴의 복사본을 보유하고 있으며
"prelen" 길이입니다. 새로운 패턴이 컴파일될 때(루프 내부 등)
내부 "regcomp" 연산자는 마지막으로 컴파일된 "REGEXP"의 "precomp" 및 "prelen"이
새 패턴과 동일하며, 그렇다면 새 패턴을 컴파일하는 대신 이전 패턴을 사용합니다.
하나.
"Perl_pp_regcomp"의 관련 조각:
if (!re || !re->precomp || re->prelen != (I32)len ||
memNE(re->precomp, t, len))
/* 새로운 패턴을 컴파일 */
"paren_names"
이는 명명된 캡처 그룹과 해당 오프셋을 추적하기 위해 내부적으로 사용되는 해시입니다. 열쇠
버퍼의 이름입니다. 값은 이중 변수이며, IV 슬롯은 숫자를 보유합니다.
주어진 이름과 pv가 I32의 내장 배열인 버퍼의 집합입니다. 값은 다음과 같습니다.
명명된 역참조가 있는 경우 데이터 배열에 독립적으로 포함될 수도 있습니다.
익숙한.
"하위 문자열"
시작부터 고정된 오프셋에 발생해야 하는 가장 긴 문자열에 대한 정보를 보유합니다.
패턴의 시작부터 부동 오프셋에 발생해야 하는 가장 긴 문자열
패턴의. Fast-Boyer-Moore 검색을 수행하여 문자열이 맞는지 알아내는 데 사용됩니다.
정규식 엔진을 사용할 가치가 있으며 그렇다면 검색할 문자열의 위치입니다.
"하위 구걸" "서블렌" "저장된_복사본" "하위 오프셋" "하위 오프셋"
실행 단계에서 검색 및 바꾸기 패턴을 관리하고
$&, $1 등에 대한 텍스트를 제공합니다. "subbeg"는 버퍼를 가리킵니다(원래
문자열 또는 "RX_MATCH_COPIED(rx)"의 경우 복사본), "sublen"은 문자열의 길이입니다.
완충기. "RX_OFFS" 시작 및 끝 인덱스는 이 버퍼에 색인을 생성합니다.
"REXEC_COPY_STR" 플래그가 있지만
"REXEC_COPY_SKIP_PRE" 또는 "REXEC_COPY_SKIP_POST" 플래그, 엔진은 복사하지 않도록 선택할 수 있습니다.
전체 버퍼("RXf_PMf_KEEPCOPY" 또는
관련 비트가 "PL_sawampersand"에 설정됨). 이 경우 "suboffset"을 다음으로 설정할 수 있습니다.
버퍼의 논리적 시작에서 물리적 시작까지의 바이트 수를 나타냅니다.
(즉, "subbeg"). 또한 오프셋의 문자 수인 "subcoffset"을 설정해야 합니다.
후자는 바이트가 아닌 문자로 작동하는 "@-" 및 "@+"를 지원하는 데 필요합니다.
"포장" "랩렌"
문자열 "qr//"을 문자열화하여 저장합니다. 예를 들어 Perl 엔진은 "(?^:eek)"를 다음 위치에 저장합니다.
"qr/eek/"의 경우.
인라인 수정자에 대한 "(?:)" 구문을 지원하지 않는 사용자 정의 엔진을 사용할 때,
"qr//"를 제공된 패턴으로 문자열화하는 것이 가장 좋습니다.
다음과 같은 경우 원하지 않는 패턴을 만듭니다.
내 $x = qr/a|b/; # "a|b"
내 $y = qr/c/i; # "씨"
내 $z = qr/$x$y/; # "a|bc"
이 문제에 대한 해결책은 커스텀 엔진이
"(?:)"와 같은 구성.
"본_평가"
이것은 패턴에 평가 그룹의 수를 저장합니다. 이것은 보안 목적으로 사용됩니다
"qr//"을 사용하여 컴파일된 정규식을 더 큰 패턴에 포함할 때.
"참조"
구조가 참조되는 횟수입니다. 이것이 0으로 떨어지면 정규 표현식은
pregfree를 호출하면 자동으로 해제됩니다. 이는 각 엔진에서 1로 설정되어야 합니다.
"comp" 루틴.
연혁
원래 perlreguts의 일부입니다.
작가
원래 Yves Orton이 작성하고 AEvar Arnfjoer의 Bjarmason이 확장했습니다.
onworks.net 서비스를 사용하여 온라인으로 perlreapi 사용