날짜: 1996-04-18 | 글쓴이: 도아 | 6692 번 | 프린트 | 메일로보내기

제 18강 - 대치와 변환


정규식으로 일치시키는 것 뿐만아니라 펄은 이러한 일치를 근거로 문자열을 대치할 수 있다. 대치를 하는 방법은 vi 편집기에서 대치하는 방법과 유사하게 설계된 s 함수를 사용한다. 일치연산자가 생략된다면 대치는 $_ 변수에대해 수행되는 것으로 가정한다.

문자열 $sentence의 london을 London으로 대치하기위해 다음 표현식을 사용한다.

$sentence =~ s/london/London/

위의 코드에서도 $_ 변수를 사용하면

s/london/London/

가 된다. 두개의 정규식(london과 London)은 총 세개의 슬래쉬에의해 감싸여진다. 이 표현식의 결과는 수행된 대치 횟수이므로 이 경우 0(거짓) 또는 1(참)이된다. 옵션

이 예는 문자열에서 첫번째로 나타나는 문자열만 대치한다. 그러나 일반적으로 대치하려는 문자열은 한번 이상 나타날 것이다. 전역 대치를 수행하기위해 마지막 슬래쉬에 이어 다음과 같이 g를 사용한다:

s/london/London/g

물론 이 것도 $_ 변수에대해 동작한다. 다시 표현식은 수행된 대치 횟수, 즉, 0(거짓)이나 1이상의 값(참)을 리턴한다. 만약 lOndon, lonDON, LoNDoN등을 대치하려면 다음과 같은 표현식을 사용할 수 있다.

s/[Ll][Oo][Nn][Dd][Oo][Nn]/London/g

그러나 훨씬 쉬운 방법은 i(Ignore Case)옵션을 사용하는 것이다. 즉,

s/london/London/gi

은 대소문자를 구분하지 않고 전역 대치를 수행한다. i 옵션 또한 기본적인 /.../ 정규식 일치에 사용된다. 패턴기억

일치되었을 때의 패턴을 기억해서 다시 사용할 수 있다는 것은 종종 유용하다. 둥근괄호내에서 일치된 것은 변수 $1,...,$9에 저장된다. 이들 문자열은 특수 RE 코드 \1,...,\9를 사용해서 동일한 정규식(또는 대치)내에서 사용될 수 있다. 예를들어

$_ = "Lord Whopper of Fibbing";
s/([A-Z])/::/g;
print "$_\n";

은 대문자를 콜론(:)으로 감싼 문자로 대치한다. 따라서 이 것은 :W:hopper of :F:ibbing과같이 출력된다. 변수 $1,...,$9는 읽기만 가능한 변수이므로 이들을 변경할 수는 없다.

또다른 예로서 다음을 시험하기바란다.

if (/(\b.+\b) /)
{
    print "가 반복적으로 발견되었습니다.\n";
}

은 임의의 반복되는 단어를 검사한다. 각 \b는 단어 경계를 표현하며, .+는 공백 이외의 문자를 일치시킨다. 따라서 \b.+\b는 두 단어 경계사이의 임의의 문자를 일치시킨다. 일단 일치되며, 괄호에의해 기억되며, \1(정규식)와 $1(프로그램)으로 저장된다.

다음은 $_ 변수내의 첫문자와 마지막 문자의 순서를 서로 뒤집는 예이다.

s/^(.)(.*)(.)$//

^와 $는 행의 시작과 끝은 일치시킨다. \1 코드는 첫번째 문자를 저장하며 \2는 첫문자와 마지막 문자를 제외한 모든 문자를, \3는 마지막 문자를 저장한다. 마지막으로 전체행은 \1과 \3이 서로 뒤바껴 대치된다.

일치가 일어난 후, 특수 읽기 변수, $`, $&, $'를 사용할 수 있다. $`, $&, $'는 각각 일치가 일어나기 전, 일치중, 일치가 일어난 후의 문자를 찾는데 사용된다.

$_ = "겁없은 토깽이";
/토/;

따라서 다음 모든 것은 참이된다('eq'는 문자열 등위 연산자임을 기억하기 바란다).

$` eq "겁없은 ";
$& eq "토";
$' eq "깽이";

마지막으로 패턴기억에서 알고 있어야 할 것은 일치나 대치를 표현하는 슬래쉬내의 변수는 값으로 대치된다는 것이다. 따라서

$search = "the";
s/$search/xxx/g;

는 the를 xxx로 대치할 것이다. there을 대치하기위해 s/$searchre/xxx/을 사용할 수 없다. 왜냐하면 이 것은 변수 $searchre를 값으로 대치하기때문이다. 대신에 중괄호 내에 변수명을 둠으로서 가능하다.

$search = "the";
s/${search}re/xxx/;
변환

tr 함수는 문자대 문자 변환을 허용한다.다음 표현식은 $sentence 변수내의 a를 e로, b를 d로, c를 f로 변환한다. 이 표현식은 변환횟수를 리턴한다.

$sentence =~ tr/abc/edf/

특수 RE 코드의 대부분은 tr 함수에 적용할 수 없다. 예를들어 다음 문장은 $sentence 변수내의 별표의 갯수를 세어 $count 변수에 저장한다.

$count = ($sentence =~ tr/*/*/);

그러나 대쉬는 값과 값의 "사이"라는 의미로 여전히 사용된다. 다음 문장은 $_를 대문자로 변환한다.

tr/a-z/A-Z/;
연습

다음은 정규식과 패턴 대치의 예로서 vi 편집기에서 직접 시험할 수 있다. 펄과 vi의 차이점은 (를 \(로 표시하는 정도이다.

빈라인 삭제
:g/^$/d

경로명 변경
:%s/\/usr\/bin/\/bin/g

-로 분리된 아이템의 순서 변경
:%s/\(.*\) - \(.*\)/ - /g

하나 이상의 공백을 하나의 공백으로 변경
:%s/  */ /g

행 앞의 모든 공백의 삭제
:%s/^  *\(.*\)//g

행끝의 모든 공백제거
:%s/\(.*\)  *//g

대문자로 변환
:%s/.*/\U&/g

라인끝은 ^M 문자 삭제
:%s/^V^M//g


다음글: 제 19강 - CGI 입력 디코딩 (7176)1996-04-19
이전글: 제 17강 - 문자열 일치 (13010)1996-04-17

세상사는 이야기

  • 찾아라! 아이폰 순정용 >
  • 만원대 피젯 스피너를 >
  • 망하는 길을 택한 쿠팡 >
  • 물놀이에 적당한 가성 >
  • 컴퓨터를 IPTV로 2, po >
  • 컴퓨터를 IPTV로 만들 >
  • Warning.or.kr도 우회 >
  • 한국의 100대 부자, 어 >
  • 세상을 바꾼 크롬: 크 >
  • 장난(?)으로 시작한 여 >


  • RSS 구독 (익명 | 회원 | 강좌 | 포럼)
    (C) 1996 ~ 2017 QAOS.com All rights reserved.