패턴 일치(Pattern Matching)는 문자열 내부에 어떤 특징을 가진 부분을 찾아내는 작업을 말한다. Perl에서의 패턴 일치 기능을 잘 활용하면 보다 쉽게 프로그램을 할 수 있다.

 

[형식]

/abc/

 

[형식 설명]

패턴은 슬래쉬(/) 두 개 사이에 문자를 넣어서 표현한다. /abc/ abc라는 패턴을 나타낸다.  특수 문자를 사용하여 여러 가지 다양한 조건으로 표현을 할 수 있다. 다음의 예를 살펴보자.

표현

의미

예제

xyz

같은 문자열

Xyz

x*

x가 없거나 여러 개 있다 .

“”, x, xx, xxx

x+

x가 한 개 이상 있다.

x, xx, xxx

?

0 또는 1개의 임의의 문자

“”, a, b, c

.

1개의 임의의 문자

a, b, c

^xyz

xyz로 시작한다

xyzabc

xyz$

xyz로 끝난다

abcsdxyz

[xyz]

xyz 중에 하나

x, y, z

[xyz]+

xyz 중에 하나 이상

xy, xyz, xxyz,

[a-zA-Z0-9]

모든 알파벳과 숫자 중에 하나

a, b, 4, 5,

[^xyz]

xyz가 아닌 문자

s, w, t

xy|yz|zx

xy, yz, zx 중에 하나

xy, yz, za

 

 

(1) 일치 연산자

 

[형식]

$var =~ /pattern/;

 

[형식 설명]

문자열에서 특정 패턴이 포함되어 있는지 검사하는 연산자이며 =~를 사용한다. 문자열이 패턴을 포함하고 있으면 참을 아니면 거짓을 리턴한다.

 

[예제 1]

$string = abcde;

if ($string =~ /bcd/)

{

             print Yes\n;

}

else

{

             print No\n;

}

 

 

[실행 결과]

Yes

 

[예제 설명]

앞의 예제는 일치 연산자를 사용한 간단한 프로그램이다. abcde라는 문자열이 저장된 $stringbcd라는 패턴을 포함하고 있는지 검사를 해서 포함하고 있으면 Yes, 그렇지 않으면 No를 출력한다.

 

[예제 2]

print "- Input Variable : ";

$input = <STDIN>;

chop($input);

if ($input =~ /^[\$\@][A-Za-z_][A-Za-z0-9_]*$/)

{

             print $input is correct variable.\n;

}

else

{

             print $input is invalid variable.\n;

}

 

 

[실행 결과]

- Input Variable : $abc

$abc is  correct variable.

 

- Input Variable : $32abc

$32abc is invalid variable.

 

 

[예제 설명]

앞의 예제는 Perl 변수명을 체크하는 프로그램이다. 자세히 살펴보자.

우선 Input Variable :이라는 메시지를 출력하고 사용자로부터 입력을 받는다. <STDIN>는 사용자로부터 입력을 기다리다가 입력을 하고, 엔터를 입력하면 입력된 값을 $input에 저장하고 다음으로 넘어간다. 그 다음에 다시 chop($input)이 나온다. 앞에서 이미 보아서 알고 있겠지만 chop은 문자열에서 마지막 한 글자를 제거하는 기능을 한다. 그렇다면 여기서는 왜 사용했을까? <STDIN>을 통해서 $input에 저장된 내용에는 사용자가 입력한 모든 내용이 들어간다. 예를 들어 내가 abc라고 입력하고 엔터를 쳤다고 하자. 그렇다면 $input에는 abc만 저장되는 것이 아니고 엔터(\n) 값도 저장이 되는 것이다. 그래서 실제로는 abc\n이 되는 것이다. 그렇기 때문에 엔터를 제외한 사용자가 입력한 값을 얻기 위해서는 chop을 사용하여 마지막 문자를 제거하는 것이다.

 

chop 함수는 매우 중요하다. 프로그램을 하다가 보면 chop을 하지 않아서 에러가 나거나 정확한 결과를 내지 못하는 경우가 많다. chop의 중요성을 모르고 있으면 엉뚱한 곳에서 당황하게 되는 경우가 종종 있으니 chop의 사용 방법에 대해 잘 알아두는 것이 좋다.

 

이렇게 입력된 값을 if 문에서 /^[\$\@][A-Za-z_][A-Za-z0-9_]*$/을 만족하는지 검사한다. 앞에서 소개한 패턴에 관해 잘 공부해 두었다면 위의 내용이 어떤 의미인지 금방 알 수 있겠지만 하나씩 살펴 보면 우선 ^[\$\@]은 처음이 $ @로 시작하는지를 검사하게 된다. 두 번째 [A-Za-z_]는 알파벳 대문자 A부터 Z 또는 소문자 a부터 z까지와 _ 를 포함하는지 검사한다. 그리고 마지막 부분에 [A-Za-z0-9_]*$는 모든 알파벳 또는 숫자가 없거나 1개 이상 존재하고, 알파벳 또는 숫자로 끝나는 문자열을 검사한다. 종합하면 앞에서 배워봤던 변수 이름을 짓는 규칙과 같다. 잘 기억이 나지 않으면 앞에 변수 부분을 살펴보기 바란다. 실행을 해서 $abc를 입력했더니 조건에 적합하기 때문에 correct variable이라는 메시지가 출력되었다.

 

(2) 불일치 연산자

 

[형식]

$var !~ /pattern/;

 

[형식 설명]

=~의 반대로 문자열이 패턴을 포함하고 있지 않으면 참을, 포함하고 있으면 거짓을 리턴한다.

 

(3) 치환 연산자

 

[형식]

$var =~ s/pattern1/pattern2/option;

 

[형식 설명]

문자열 $var에서 pattern1을 찾아서 pattern2로 바꾸어 주는 기능을 한다. option에 따라 기능을 조금 다르게 적용할 수 있는데 option은 다음과 같다.

 

옵션

설명

g

패턴의 모든 이벤트를 변경한다.

i

대소문자를 구분하지 않는다.

e

고체 문자열을 식으로 인식한다.

m

일치될 문자열을 다중 라인으로 취급한다.

o

단 한 번만 판별한다.

s

일치될 문자열을 단일 라인으로 취급한다.

x

패턴에서 화이트 스페이스를 무시한다.

 

다음의 예문을 살펴보자.

 

$string = I love Jane;

$string =~ s/Jane/Tony/g;

 

$string에는 I love Jane이라는 내용이 들어 있고 치환 연산자를 이용하여 Jane Tony로 바꾸는 명령이다. 수행이 끝나고 나면 $string에는 I love Tony이라는 문자열이 들어가게 된다.

 

 

(4) 변환 연산자

 

[형식]

$var =~ tr/string1/string2/option;

 

[형식 설명]

tr 연산자에서는 string1에 교체될 문자들의 목록을 포함하고, string2는 교체할 문자들을 포함한다. string1의 첫 번째 문자는 string2의 첫 번째 문자와 교체된다. string1 string2의 각각의 자리에 맞춰서 변환되는 것이다. 다음의 예문을 보자

 

$string = abcdefgabcd;

$string =~ tr/abc/def/;

 

a d, b e, c f로 변환되어 $string에는 defdefgdefd가 들어가게 된다.

Posted by OJJ