날짜: 1996-03-12 | 글쓴이: 도아 | 6335 번 | 프린트 | 메일로보내기

펄을 배우자 - 제 9강 대치와 변환


정규식으로 일치시키는 것 뿐만아니라 펄은 이러한 일치를 근거로 문자열을 대치할 수 있다. 대치를 하는 방법은 vi 편집기에서 대치하는 방법과 유사하게 설계된 s 함수를 사용한다. 일단 일치 연산자가 사용되며, 일치연산자가 생략된다면 대치는 $_ 변수에대해 수행되는 것으로 가정한다. 문자열 $sentence의 londonLondon으로 대치하기위해 다음 표현식을 사용한다.
$sentence =~ s/london/London/
위의 코드에도 $_ 변수를 사용하면
s/london/London/
가 된다. 두개의 정규식(londonLondon)은 총 세개의 슬래쉬에의해 감싸여진다. 이 표현식의 결과는 수행된 대치 횟수이므로 이 경우 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])/:\1:/g;
print "$_\n";
은 대문자를 콜론(:)으로 감싼 문자로 대치한다. 따라서 이 것은 :L:ord :W:hopper of :F:ibbing과같이 출력된다. 변수 $1,...,$9는 읽기만 가능한 변수이므로 이들을 변경할 수는 없다. 또다른 예로서 다음을 시험하기바란다.
if (/(\b.+\b) \1/)
{
	print "$1가 반복적으로 발견되었습니다.\n";
}
은 임의의 반복되는 단어를 검사한다. 각 \b는 단어 경계를 표현하며, .+는 공백 이외의 문자를 일치시킨다. 따라서 \b.+\b는 두 단어 경계사이의 임의의 문자를 일치시킨다. 일단 일치되며, 괄호에의해 기억되며, \1(정규식)와 $1(프로그램)으로 저장된다. 다음은 $_ 변수내의 첫문자와 마지막 문자의 순서를 서로 뒤집는 예이다.
s/^(.)(.*)(.)$/\3\2\1/
^$는 행의 시작과 끝은 일치시킨다. \1 코드는 첫번째 문자를 저장하며 \2는 첫문자와 마지막 문자를 제외한 모든 문자를, \3는 마지막 문자를 저장한다. 마지막으로 전체행은 \1\3이 서로 뒤바껴 대치된다. 일치가 일어난 후, 특수 읽기 변수, $`, $&, $'를 사용할 수 있다. $`, $&, $'는 각각 일치가 일어나기 전, 일치중, 일치가 일어난 후의 문자를 찾는데 사용된다.
$_ = "겁없은 토깽이";
/토/;
따라서 다음 모든 것은 참이된다('eq'는 문자열 등위 연산자임을 기억하기 바란다).
$` eq "겁없은 ";
$& eq "토";
$' eq "깽이";
마지막으로 패턴기억에서 알고 있어야 할 것은 일치나 대치를 표현하는 슬래쉬내의 변수는 값으로 대치된다는 것이다. 따라서
$search = "the";
s/$search/xxx/g;
thexxx로 대치할 것이다. there을 대치하기위해 s/$searchre/xxx/을 사용할 수 없다. 왜냐하면 이 것은 변수 $searchre를 값으로 대치하기때문이다. 대신에 중괄호 내에 변수명을 둠으로서 가능하다.
$search = "the";
s/${search}re/xxx/;
변환 tr 함수는 문자대 문자 변환을 허용한다.다음 표현식은 $sentence 변수내의 ae로, bd로, cf로 변환한다. 이 표현식은 변환횟수를 리턴한다.
$sentence =~ tr/abc/edf/
특수 RE 코드의 대부분은 tr 함수에 적용할 수 없다. 예를들어 다음 문장은 $sentence 변수내의 별표의 갯수를 세어 $count 변수에 저장한다.
$count = ($sentence =~ tr/*/*/);
그러나 대쉬는 값과 값의 "사이"라는 의미로 여전히 사용된다. 다음 문장은 $_를 대문자로 변환한다.
tr/a-z/A-Z/;
연습 현재 프로그램은 어떤 문자열을 포함하는 행을 센다. 이 프로그램을 2중 문자(연속으로 같은 문자가 두개가 이어지는)를 갖는 행을 세도록 변경한다. 이것을 다시 이중문자가 괄호내에 나타나도록 변경한다. 예를들어 이 프로그램은 다음과 같은 형식으로 출력되어야 한다.
023 겂없은 토깽이는 모를 잘못먹어서 그렇게 됐을까(??)?
또한 모든 문자쌍이 괄호 내에 나타나지만 각행의 첫번째 쌍은 괄호내에 나타나지 않도록 변경한다. 프로그램을 보다 흥미있게 작성하기위해 다음을 시도해보기 바란다. 자신의 프로그램의 이름이 countlines라고 가정하자. 그러면 명령행에서 다음과 같이 프로그램을 호출할 수 있다.
./countlines
그러나 이 프로그램을 다음과 같이 여러개의 인자로 호출한다면
./countlines first second 등
이들 인자는 배열 @ARGV에 저장된다. 위의 예에서 $ARGV[0]first를, $ARGV[1]second을, $ARGV[2]etc을 갖게된다. 하나의 인자를 받아들여 이 인자를 포함하는 행만 세어 행번호를 출력하는 프로그램으로 변경하라. 이전 연습과 마찬가지로 이들 문자는 괄호내에 나타나야 한다.
./countlines ??
는 다음과 같은 출력을 만들 것이다.
023 겂없은 토깽이는 모를 잘못먹어서 그렇게 됐을까(??)?


다음글: 펄을 배우자 - 제 10강 Split (6893)1996-03-13
이전글: 펄을 배우자 - 제 8강 문자열 일치 (9217)1996-03-11

세상사는 이야기

  • 장난(?)으로 시작한 여 >
  • 탈옥의 필수, QuickDo >
  • 윈도 10, 한영 전환도 >
  • 바보도 할 수 있는 War >
  • 북마크에도 확장 아이 >
  • 크롬은 가라, 비발디가 >
  • 감히 아이폰 관리의 최 >
  • 디지털 노마드의 편집 >
  • [블로그 복귀 알림] 새 >
  • 오타도 즐거운 안드로 >


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