Tips in Action‎ > ‎정규식‎ > ‎

정규식 /^\\/long\\/path\\/makes\\/dirty\\/pat/이 싫어

전종필

정규식을 사용함에 있어서 간혹 당혹스럽게 하는 것이 / 문자입니다.
예를 들어서

if( $path =~ /^\/my\/data\/directory\/is\/very\/long\// ) {
	print "찾았어요\n";
}
와 같은 정규식은 어려운 것도 아닌데 사람을 어지럽게 만들어 줍니다. 경로를 구분하는 / 문자가 정규식의 구분자인 /와 같기 때문에 그 앞에 \ 문자를 사용하여 escape시켜주어야 하기 때문에 발생하는 문제입니다. 저렇게 해 놓으니 정말 어려운 정규식 처럼 보이는군요.
좀더 간결하게 하고 싶은데...
Perl은 아시는 것처럼 ``무지무지 실용적인''언어이기 때문에, 정규식의 구분자인 /를 바꿀 수 있게 해 줍니다.

if( $path =~ m(^/my/data/directory/is/very/long/) ) { # 정말 깔끔해졌죠?
	print "찾았어요\n";
}
새로운 예문에서는 // 대신에 m()을 사용합니다.
//는 m//, m[], m{}, m(), m!! 등등, 거의 모든 부호를 m자와 함께 사용하여 대체할 수 있습니다.
//를 m()로 대체하면 안에 들어가는 내용의 /는 더 이상 특별한 문자가 아니므로 \/ 대신 /를 사용하면 됩니다. 만일 정규식 안에 괄호를 사용해야 한다면 m() 대신에 m{}나 m||(pipe 혹은 or 문자) 등을 사용하면 그만입니다.
이 것은 마치

$text = "쌍따옴표는 \"를 두개 사용하여 \"문자\"와 같이 사용한다";
대신에

$text = qq/쌍따옴표는 "를 두개 사용하여 "문자"와 같이 사용한다/;
처럼 qq//나 qq!! 등을 사용하는 것과 같은 의도입니다.
또, 이와 같은 구분자의 선택은 m//뿐 아니라 s///, tr///에서도 똑같이 적용됩니다.

$newpath = $path;
$newpath =~ s(^/my/data/directory/is/very/long/)(/short/path/); # s()()
$newpath =~ tr|a-z|A-Z|; # tr|||
Comments