2013-11-25 3 views
1

샘플 입력이 작업을 수행하는 함수를 필요 :펄에서

ATAT 

GATATATGCATATACTT 

샘플 출력 :

1 3 9 

을 내가 정규식 부분을 얻을 수 있지만, 우리는 위치 인스턴스를 사용하는 방법을 이해하지 않습니다.

답변

3

내장 된 배열 @-에는 마지막으로 성공한 정규식과 그 캡처가 대상 문자열에 나타나는 위치가 저장됩니다. 등 $-[1]이와 함께 등

캡처 $1의 위치를 ​​누르고있는 동안 그래서 $-[0]는 전체 패턴이 일치하는 경우라고, 당신은 기대 미리을 대신 간단한 정규식의, 그렇지 않으면 정규 표현식을 사용할 필요가 엔진은 발견 된 이전 일치 끝 부분 이후에만 후속 일치 항목을 찾고 을 찾기 시작할 것이므로 중복되는 항목을 찾을 수 없습니다.

이 코드는 사용자가 질문하는대로 수행합니다.

use strict; 
use warnings; 

my $seq = 'GATATATGCATATACTT'; 

my @offsets; 
push @offsets, $-[0] while $seq =~ /(?=ATAT)/g; 
print "@offsets\n"; 

출력

1 3 9 
1

정규식이 필요, index는 모든 일을 수행 할 수 있습니다

#!/usr/bin/perl 
use warnings; 
use strict; 

my $substring = 'ATAT'; 
my $string = 'GATATATGCATATACTT'; 

my @positions; 
my $pos = -1; 
while (-1 != ($pos = index $string, $substring, $pos + 1)) { 
    push @positions, $pos; 
} 
print "@positions\n";