2008. 6. 5. 17:45

정규표현식과 코드골프에 관한 IRC로그

어제 IRC에서 나온 뼈가되고 살이되는 펄 얘기 입니다.
주로 간단한 정규 표현식으로 뭘 할 수 있는지 에 관한 얘기죠.
재미있는 로그라 모두 긁어왔는데 좀 기네요. 132줄!!


하지만 읽기 귀찮으신 분들을 위해서 정리도 해드리는 센스!!
두개의 문제가 나왔는데

1.  연숙된 문자열에서 숫자의 앞뒤에 공백 넣기

"11aa11bbcc222d" 를 "11 aa 11 bbbb 222 d" 로 바꾸는 거죠.
간단한 문제이니 만큼 답도 간단합니다.
s/(\d+)/ $1 /g

또는
perl -pe 's/(\d+)/ $1 /g'


2. perldoc 문서 이름을 위키네임으로 바꾸기

twiki에 perldoc관련 플러그인을 만들다가 나온 문제입니다.
perldoc은 perlsub, perlreftut처럼 perl로 시작하고 모두 소문자로 되어있는데
이걸 PerlSub, PerlReftut 처럼 perl의 P와 perl 뒤으 문자 하나 총 2개의 대문자를 가진 문자열로 바꾸는 문제입니다.
다음 코드들에서 print가 나왔다가 안나왔다가 하는 이유는 저는 문자열 반환이 목적이었고, saillinux님과 aero님은 출력이 목적이었기 때문입니다. 알아서 잘 해석해주세요^^
 문자열이 $_에 저장되어 있다고 가정하면
처음에 나온 코드는  saillinux 님의
print "Perl".join '', map {ucfirst}split(/perl/, "$_");

오 훌륭하군요,
약간 바꿔보면
 print join '', map ucfirst, /(perl)(.*)/;

이렇게도 가능하지요.

제가 정규표현식을 써서 만든 코드는 
s/(perl)(.*)/ucfirst$1.ucfirst$2/e


이걸 코드 골프용으로 고치면,, 보기에는 지저분 하지만
/l/;ucfirst$`.'l'.ucfirst$

이렇게 만들 수 있습니다.

이걸 보여드렸더니 aero님께서 다른 아이디어를 제시하시더군요
print map "\u$_",/(perl)(.*)/


호~~ \u가 있었군요. 저는 \U는 알고 있었는데, \U는 한문자에만 적용되는 것이 아니라 \E와 쌍을 이루는 것이어서 못쓰고 있었거든요. 그래서.. 잽싸리 저도 코드를 바꿔봤습니다.
/l/;"\u$`l\u$'"

오호. 마지막 코드를 보신 aero님께서 한 말씀 날려주시더군요
ㅂㅌ

추가:2008/06/08
오늘 아침에 나온 아이디어입니다.
s/(perl|.*)/\u$1/g

우왕~~


코드에 대한 자세한 설명은 saillinux 님께서 해주시리라 믿습니다.