2014-11-06 2 views
0

검색하고 검색했지만 필요한만큼 정확하게 작동하지 않습니다.일치하는 전후 모두 지우기

내 스크립트가 지금까지 모든 것을 올바르게 수행하고 있습니다. 한 줄의 긴 문자 인 텍스트 파일을 입력합니다. 스크립트는 사용자에게 첫 번째 입력을 요청한 다음 두 번째 입력을 요청합니다. 나는 첫 번째 입력 이전과 두 번째 입력 이후에 오는 모든 문자를 제거하기 위해 스크립트를 얻으려고합니다. 일치하는 입력 자체를 삭제하고 싶지 않습니다.

파일에 "1111111111111111111111111CAT1111DOG11111111111"이 포함되어 있고 사용자가 첫 번째 입력에 "CAT"를 입력하고 두 번째 입력에 "DOG"를 입력 한 경우 "CAT1111DOG"로 끝내기를 원합니다.

입력 및 내보내기 등의 도움이 필요하지 않습니다. 내 $line 문자열로만 작업하고 있습니다. 첫 번째 입력 변수 이전과 두 번째 입력 변수 이전의 모든 것을 어떻게 삭제할 수 있습니까? 아마도 정규식 솔루션일까요? 파일에있는 입력 변수가 항상 같은 길이가 아닐 수도 있습니다. 다음과 같이

+1

목표는 삭제하는 것이 아니라 추출하는 것입니다. –

+0

감사합니다. 내 검색이 도움이되지 않는 이유가 있어야한다는 것을 알고있었습니다. 그래서 제 질문은 반대의 문제가 있습니다. 두 패턴을 제외하고는 추출 할 수 있습니다. – user2906976

답변

0

이것은 예상치를 제공합니다.

use warnings; 
use strict; 
my @data = <DATA>; 
print "Enter ther first value: "; 
chomp (my $first =<>) ; 
print "Enter the second value: "; 
chomp (my $sec = <>); 
my @ar =map{m/$first.*$sec/gi} @data; #simply do it 
print "@ar\n"; 
__DATA__ 
1111111111111111111111111CAT1111DOG11111111111 

나는 태초과 마지막 경기를 위해 데이터를 map 기능을 사용했다. . 이것은 무엇이든 일치하는 개행 문자와 일치하고 *은 0 이상의 일치와 일치합니다.

+0

으로 문자열에서 개행 문자를 제거 할 가치가있을 수도 있습니다. 지금까지 작동하지만, 매번 데이터를 입력하지 않고 파일에서 데이터를 가져오고 싶습니다. 그것을 실행하십시오. 수천자를 넘을 수 있습니다. – user2906976

+0

완료,이 완벽하게 작동합니다. – user2906976

1

당신은 그것을 할 수 있습니다 : 파일을 저장하는 경우에는 사용자 입력으로 위치 매개 변수를 입력 할 수 있습니다

$one = $ARGV[0] || "CAT" ; 
$two = $ARGV[1] || "DOG" ; 
$str = $ARGV[2] || '1111111111111111111111111CAT1111DOG11111111111'; 

$abc; 

# This version will capture the match to a new variable 
if ($str =~ m/($one.*$two)/) { 
    print "$1\n"; 
    $abc = $1; 
} 

# This version will replace the original string with the match 
$str =~ s/.*($one.*$two).*/$1/; 
print "$abc\n$str\n"; 

.

+1

두 번째 코드의 경우 처음과 끝에'. * '를 사용할 필요가 없습니다. –

+0

@CasimiretHippolyte True - amended – arco444

+2

잘못된 것을 변경했습니다. – RobEarl