2013-08-20 5 views
2

검색 할 문자열 목록이 있으며 연속적으로 4 회 이상 발생하는 A 또는 G 문자가 포함 된 문자열 목록은 무시됩니다. 예를 들어 TCAAAATC 또는 GCTGGGGAA와 같은 문자열을 무시하고 싶습니다.연속 패턴 일치 패턴

unless ($string =~ m/A{4,}?/g || m/G{4,}?/g) 
{ 
    Do something; 
} 

하지만 오류 메시지 "패턴 일치 (m //)에서 초기화되지 않은 값의 사용을"얻을 :

은 내가 시도했습니다.

의견을 보내 주시면 감사하겠습니다.

+0

정의 된 값으로 당신의'$ string' 변수 세트가합니다 (정규식에 만든 단순화주의)? –

+0

예. $ string은 검색하는 파일의 각 행에 설정됩니다. – user2674514

답변

3

귀하는 서면으로 할 수 $_로 암시 적 비교를 피하기 위해 필요

이 정확히 4 A의 또는 정확히 4 G의 문자열을 찾습니다
unless ($string =~ m/A{4}/ || $string =~ m/G{4}/) 

; (4)이있는 경우,이 있는지 여부를 중요하지 않는 이상 4

당신은 사용하여 단일 정규 표현식으로 줄일 수 있습니다 : 다음에 A 또는 G를 찾습니다

unless ($string =~ m/([AG])\1{3}/) 

같은 성격의 3 개 이상.

|| m/G{4,}?/g 

를 작성하여

+0

나는'A {4} | G {4}'를 더 좋아합니다. 조금 더 명료하고 조금 덜 마법적입니다. – nneonneo

+0

반복 횟수가 4 일 때 성능 차이를 입증 할 수 있는지 확신 할 수 없지만 카운트가 400 일 경우 교대가 더 느릴 것이라고 생각합니다. 물론 잘못된 것으로 입증됩니다. 그러나 이해하기가 더 쉽다는 것에 동의합니다. –

+0

그래, 글쎄, 나는 Perl의 매치 퍼포먼스에 대해별로 생각하지 않는다. Perl 정규 표현식 코어는 수많은 비공식적 인 최적화를 수행하는 경향이있어 놀라운 결과를 초래할 수 있습니다. – nneonneo

3

당신은 암시 적으로이 정규식에 대해 $_을 테스트하고 있습니다. 그러나 $_은 초기화되지 않으므로 오류가 발생합니다.

쓰기

unless ($string =~ m/A{4}/ || $string =~ m/G{4}/) 

대신 하나의 표현으로, 또는,

unless ($string =~ m/A{4}|G{4}/) 
+0

거기에'? '를 넣지 않으실 래요? 4 A 또는 4 G의 0 또는 1 회 연속 발생을 의미합니다. 그렇지 않습니까? –

+0

@JonathanLeffler : 수량 한정자 뒤에 나오는 "비 욕심 많은"의미입니다. 그것은 아마도 필요하지 않습니다. – nneonneo

+0

오, 그래 ...그러나 그것을 따르는 아무것도없이, 탐욕 또는 비 탐욕은 중요하지 않습니다. –