perl 중에 원하는 문자열부터 출력하게 하려면어떻게 하죠 고수님들 부탁드려요
글쓴이: windyguy81 / 작성시간: 월, 2010/01/18 - 3:10오후
ex) abcdefghijklmn 문자열에서
원하는 b부터 j까지 출력하려면 어떻게 해야할까요..
해결) bcdefghij
그리고 만약
ex) 가나다라마바사아자차아자차
에서 나부터 아까지
해결) 나다라마바사아
나다라마바사아자차아
이런식으로 2개를 출력하게 가능할까요...고수님들 부탁드려요
Forums:


이렇게
look-ahead assertion 을 사용
문자열 내에서 각 첫글자와 끝글자가 일치하는 모든 서브 문자열의 복사본의 리스트를 리턴하려고 할 때,
한가지 방법으로 look-ahead assertion (?=...) 을 사용합니다.
즉 매치 검색시 (?=.*$end)와 같이 하여 원하는 문자열($end)이 뒤에 존재할 경우 현재의 위치가 매치되며,
그 위치로부터 while 루프를 순회하여 매치되는 모든 $end의 위치(pos)를 통해 서브 문자열(substr)을 얻습니다.
#!/usr/bin/perl use 5.010; use warnings; use strict; sub match_end_points { my ($string, $start, $end) = @_; my @ret; while( $string =~ /$start(?=.*$end)/g ){ my $substr = $'; while( $substr =~ /.*?$end/g ){ push @ret, $start.substr($substr, 0, pos($substr)); } } @ret; } say " @ example 01"; say for match_end_points( "bcdefghij", "b", "j" ); say ""; say " @ example 02"; say for match_end_points( "가나다라마바사아자차아자차", "나", "아" ); say ""; say " @ example 03"; say for match_end_points( "abcbdeacb", "a", "b" ); say "";say() 함수는 Perl 5.10 버전 이상에서만 제공되며,
버전이 낮을 경우 use 5.010 프래그마를 주석 처리한 뒤:
sub say (_) { print defined(@_) ? @_ : "", "\n" }
와 같이 동일한 동작을 하는 사용자 함수를 정의할 수 있습니다.
다음은 실행 결과:
~am0c~
댓글 달기