어제 IRC에서 나온 뼈가되고 살이되는 펄 얘기 입니다. 주로 간단한 정규 표현식으로 뭘 할 수 있는지 에 관한 얘기죠. 재미있는 로그라 모두 긁어왔는데 좀 기네요. 132줄!!
<a3r0> 정적을 깨는 코드 골프 <a3r0> 야후 홍콩 입사문제 <a3r0> Q1. Write a perl program to insert a white space before and after the occurrence of numeric string. The program read from standard input and writes to standard output. For example, Input: ‘aaaa1111bb22cc333’, Output: ‘aaaa 1111 bb 22 cc 333 ‘ <a3r0> Q2. What does ‘my’ do? Is it the same as ‘local’ <a3r0> Q3. Suppose I want to pass two arguments to a subroutine, both of which are <a3r0> arrays. How do I do that without using global varialbe? <a3r0> 일단 1번 문제 풀어보아요~ <JEEN> 쿨럭 <JEEN> 조용...;; <a3r0> 문제 풀어보셨나요? <saillinux> ... <JEEN> ... <saillinux> 미력하지만 이렇게.. <saillinux> http://codepad.org/A0QKk5Nm <a3r0> 글자순서가 이동하지는 않지 않나요? <saillinux> 네 그 순서요;; <saillinux> '-') 힝~ <a3r0> 글자의 위치가 이동하면 안되죠 <saillinux> 꽥 <a3r0> 11aa11bbcc222d <a3r0> 11 aa 11 bbbb 222 d <a3r0> 이런식으로 되야겠죠 <saillinux> 음.. 해쉬말고 다른걸 써야 겠네요 넘 안이하게 생각한듯 <pung96> 뭐. 일단 정규식을 사용하면 <saillinux> 오오 정규식 한방으로?! <a3r0> :) <pung96> s/(\d+)/ $1 /g 면 되지 않을까요? <saillinux> 오왁 <saillinux> '-');; 이거원!! <saillinux> 마술이다 <a3r0> ㅋㅋ <a3r0> 저랑 같은 답 <a3r0> 정답은 어케 되어있냐면요 <saillinux> ;;;;;;; <JEEN> 우왕 <a3r0> foreach $char(split(//,<STDIN>)) { <a3r0> print $prev_char ne "" && $prev_char ne $char ? " $char" : $char; <a3r0> $prev_char = $char; <a3r0> } <pung96> 헉... <a3r0> 문제조건대로 표준입력 받아서 출력으로 하라면 <saillinux> 헉.... <a3r0> perl -pne 's/(\d+)/ $1 /g' <JEEN> 흡하 <a3r0> 하면 끝나죠 <pung96> 흠.. p하고 n하고 같이 들어갔네요^^ <saillinux> 우... 난왠지... <saillinux> 초좌절.. <JEEN> Yahoo 에게 대고 외치세요.. <JEEN> hire me! <a3r0> 아 n 빼도 되구나 <a3r0> 2번 3번은 다 아실테고 <saillinux> 흠 난 왜 substitution을 생각 못했을까요.. 아고고 <saillinux> 기본이 부족한것을 다시 확신 음음 역시 문법이 먼저야 <pung96> 이번에 twiki의 pod 플러그인을 손보면서 <pung96> perlreftut를 PerlReftut로 바꾸는 루틴을 만들었는데.. 어떻게 했게~~~요~ <saillinux> 이건 확실히 포스트 해야징~ <saillinux> 음음 모듈을 쓰셨다에 한표 <pung96> 흠. 그럴리가 <saillinux> 쩝.. <pung96> 정규표현식으로 한큐입니다. <pung96> 딱 보기에 왠지 정규표현식으로 해야할 것 같지 않아요? <saillinux> 역시 다들 한큐에;;; <saillinux> 그런가요 전 모듈을 5개 설치하고 20라인은 써야 하는줄 알고 <pung96> ㅎ <saillinux> 흑 ㅜㅡ <pung96> 흠.. 자~ 맞춰봅시다. <pung96> map split를 써도 코드만 짧다면, 합격!! <saillinux> 오 <pung96> join map split 세트면,, 사실 해결할 수 있죠 <saillinux> perl을 기준으로 한듯한데 <JEEN> ucfirst <JEEN> 하악 <JEEN> 이거 타다다닥 <JEEN> 샥샥 해버리면 <JEEN> 뜨어어ㅓㄱ <JEEN> 할 듯 한데.. <pung96> 참 쉽죠~ <saillinux> 음 그런듯... <saillinux> print "perl".join '', map {ucfirst}split(/perl/, "perlreftut"); <pung96> 자.. a3r0님의 답을 기대해 봅시~ <saillinux> 맞나용? <a3r0> perlreftut를 PerlReftut로 바꾸는 루틴 <saillinux> 반은 맞알기를.. <a3r0> 이거요? <pung96> 흠.. saillinux 90점, 답이 잘못나와서 10점 깎였습니다. <saillinux> 오왓 <pung96> 결과가 원하는 데로 안나올 거임 <a3r0> 어느 글자를 대문자로 만들어야 된다는 규칙이? <saillinux> print "Perl".join '', map {ucfirst}split(/perl/, "perlreftut"); <saillinux> 헤헤 <pung96> Perl의 P와 Perl바로 다음 글자만 <a3r0> 넵 <saillinux> 아고 군더더기가.. <pung96> saillinux님 현재 글자수로 1위!! <a3r0> ㅎㅎ 꽁수생각중~ <pung96> print join '',map{ucfirst}split/(perl)/,"perlreftut"; 로 하면 좀더 간단할 듯 <saillinux> 히익 <pung96> perl join'',map{ucfirst}/(perl)(\w+)/ 도 가능하구요 <pung96> s/perl/print/ <saillinux> 우.. 나도 지금방금할라 했는데.. 반성중... <pung96> 인풋은 $_로 주어지고, 결과는 스칼라 값이어야 한다고 제한을 하죠 <pung96> print만 목적이라면 사실 join도 필요 없으니깐 <saillinux> 오오 <saillinux> 흐읍 오늘부터 다시 열공 입니다 방심했다능~ ㅜㅡ 우 창피 <a3r0> perl -ne "print map ucfirst,/(perl)(.*)/;" <a3r0> 뭐 그게 그넘 <pung96> 흠. 짧은건 아닌데 제가 정규표현식으로 한 방법은 <pung96> s/(perl)(.*)/ucfirst$1.ucfirst$2/e <pung96> 뭐,, 특별한 건아니구요 <pung96> 코드골프용으로 만들면 <pung96> /l/;ucfirst$`.'l'.ucfirst$' <a3r0> 저럴때는 ucfirst함수가 유난히 길게 느껴지네요 :) <pung96> 그쵸 <a3r0> ucf 정도만 했어도 <pung96> 그래도, ucfirst 가 리더블 하죠^^ <a3r0> perl -ne 'print map "\u$_",/(perl)(.*)/;' <pung96> 호~ <a3r0> ucfirst 보다 한글자 줄어듬 <pung96> \u 는 한글자만 적용되는건가요? <a3r0> 네 <pung96> 그럼.. \U가 여러글자인가? <a3r0> 네 <pung96> 흠.. 하지만, 제가 전제에 스칼라 값으로 나와야 한다고.. ㅎㅎ 트집을 <a3r0> \E 가 나올때 까지 <pung96> 흠 그렇다면야 <pung96> /l/;"\u$`l\u$'" <pung96> ㅎㅎ <a3r0> ㅋㅋ <a3r0> 점점 변태성 짙어지는 <pung96> 와. \U는 알았는데 \u는 몰랐어요.. <a3r0> 저도 샘플원고 쓰면서 하나하나 확인해보다 알았음다. <pung96> 그래서 이 코드를 생각했었다가 포기했다능.
하지만 읽기 귀찮으신 분들을 위해서 정리도 해드리는 센스!! 두개의 문제가 나왔는데
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 님의