2011/11/03

Perl 5.10 부터 도입된 스마트매칭 ~~ 연산자와 given~when구문 문제

Perl 5.10 부터 도입된
smart match 연산자 ~~ 는 너무 경우의 수가 많아 복잡하고
경우에 따라 일관성을 가지고 동작하지 못하는 부분이 있어
차후 deprecate 시키든지 다시 깔끔하게 정리하려고 하는 것 같습니다.
따라서 그때까지는 쓰지 말기를 추천하더군요.

참고:
 http://blogs.perl.org/users/brian_d_foy/2011/07/rethinking-smart-matching.html

그리고 C의 switch 같은 기능의 given ~ when 구문은
given과 같이 사용되는 lexical $_ 변수와 위의 내부적으로
given ~ when 구문의 비교에 있어 기본으로 사용되는 smart match연산자
와 얽힌 부분에 문제가 있어 역시 향후 기능과 동작이 다시 완벽해지기
전까지는 역시 사용하지 말 것을 추천하고 있습니다.

참고:
http://www.effectiveperlprogramming.com/blog/1333
http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2011-05/thrd9.html#00768

http://blogs.perl.org/users/leon_timmermans/2011/10/why-do-you-want-new-major-features-in-core.html
에 보면
  • Smartmatching? I think everyone agrees it is broken.
  • given/when is even worse as it's almost impossible to predict if it will use smartmatching or not.
  • Lexical $_? Mostly a new source of bugs, and the _ prototype is merely a hack to work around lexical $_ issues.
라고 말하고 있음.

Learning Perl 5판 과  한글 번역판인 "거침없이 배우는 펄" 에서 smart match와 given~when 구문에
비교적 많은 분량을 할애하여 설명하고 있는데 그 부분은 그냥 무시하시면 될듯합니다.
(얼마전 나온 Learning Perl 6판에는 이런 부분을 언급하고 사용에 주의하라고 하는 내용이 들어간듯)

추가:
 ( Programming Perl 4판에서는 given ~ when은 아직 시험적 상태로 보지만 스마트매칭이 적용되지 않는 명시적인 숫자,문자열 매칭 조건은 향후 어떻게 변하든 문제 없으니 안심하고 사용해도 괜찮다고 함)

2011/10/22

기록의 의미로 다시 정리해보는 CodeGolf 용 Perl one-liner

Code Golf는 어떤 주어진 문제를 코드의 우아함, 가독성 등등따위는 제껴두고 수단과 방법을 가리지 않고 되도록이면 짧게 프로그래밍 할수록 높은 점수를 얻는 게임이다.

예전에 풀어본 문제를 기록을 남기는 의미에서 다시 정리해봄

문제)
http://kldp.org/node/112089

예를 들어, A.csv는

1   2   3
4   5   6

B.csv는
2   3   4
5   6   7
라면 같은 위치의 요소끼리 사칙연산 하려면?
답)
같은요소끼리 더하기
$ paste A.csv B.csv | perl -alpe '$_="@{[map$F[$_]+$F[$_+@F/2],0..$#F/2]}"'
3 5 7
9 11 13
문제)
http://codegolf.stackexchange.com/questions/3095/paint-that-fence
Paint the fence.
 
각 라인은 S L C 의 형태로 되어있다. S는 시작위치 L을 길이 C는 색깔을 뜻한다.
(시작위치는 0부터시작)
다음과 같은 라인에 대해서 규칙을 적용해서 펜스를 칠해나가면 펜스의 색은
오른쪽과 같을 것 이다.

0 3 1                      111...........
2 4 2                      112222........
1 2 3                      133222........
0 4 1                      111122........
7 3 5                      111122.555....

다 칠하고 난 다음 어떤색의 펜스가 얼만큼 있는지 다음과 같이

1 4
2 2
5 3

출력하는 코드를 작성하라.
답)
$ cat input.txt
0 3 1
2 4 2
1 2 3
0 4 1
7 3 5

$ cat input.txt  | perl -anE '@a[$F[0]..$F[0]+$F[1]]=($F[2])x$F[1];END{$i[$_]++for@a;$i[$_]&&say"$_ $i[$_]"for 1..$#i}'
1 4
2 1
5 3


아마 Perl 아니면 이보다 짧게 만들 수 있는 언어는 없을듯...
(요즘 보니 J란 언어가 다크호스 같긴 하지만서도..)

2011/07/30

배트맨 공식 그래프 그리기

요즘 SNS에서 다음과 같은 배트맨 공식이라는게 회자되고 있어서
























저 공식이 진짜 맞는건지 검증해보는 차원에서 Gnuplot으로 한 번 그려봄






















Gnuplot의 한계로 외곽선만으로만 뽑아내는건 힘들었음(더 찾아보면 가능할 수 도)

플로팅 소스는 http://plotshare.com/index.ws/plot/538486810

2011/07/29

서울 100년만의? 폭우기념 Visualization(가시화)그래프

서울에 100년만의 큰비로 난리났다는 뉴스에 100년만이 맞는 말이냐 아니면 구라냐 말이 많다.
어떤 분은 기상청 싸이트에서 과거 서울 강우량 기록을 긁는 스크립트까지 만드셔서
자료를 긁어 놓으셨길래 숫자만의 나열로는 느낌이 와닿지 않아 약간의 데이터 가공을
거쳐 Gnuplot을 써서 heatmap형태의 그래프로 그려보았다.

서울강우량 스크랩프로그램 및 데이터: https://github.com/yy/koweather

Gnuplot 그래프를 온라인상에서 공유하게 해주는 Plotshare에 올린 그래프

http://plotshare.com/index.ws/plot/116537618

아래는 위 싸이트에서는 이미지 싸이즈를 지정해도 일정한 크기로만 생성해서 좀 더
보기 쉽게 크게 그린 그래프 이미지.(클릭하면 크게 보임)


그래프에서 y축은 년도 x축은 1년 365일중에 몇번째 날인지, 그리고 검은색~노란색점은 강우량(mm)정도를 나타낸다. 나머지 해석은 알아서 각자...

2011/07/25

MacOS X 풀어쓰기 한글 -> 모아쓰기 한글 변환 스크립트

개인적으로 맥을 별로 좋아하지 않는다.

그 이유중 몇개를 들자면 Unix like한 OS라고 하면서 파일시스템에서 대소문자를 구분하지 않는다는 것이고.. ( 예를들면 Perl에서 AnyEvent란 모듈을 사용하겠다고 use AnyEvent;가 아니라 use ANYEVENT; 라고 해도 에러가 없이 실행된다. 만약 이런걸 맥에서 개발해서 Linux서비스 서버에 올렸다고 생각해보라.. 어떤일이 벌어질지는 안봐도 비디오다. )

그리고  맥에서는 한글이 일명 풀어쓰기 포멧(NFD)으로 저장된다. 여기에 대해서는 http://namoda.springnote.com/pages/4922363 를 보면 자세하게 나와있다.

하지만 주변에는 많은 맥빠들이 존재하고 그들과 자료를 주고 받으려고 하면 문제들이 한둘씩 발생하게 된다는 것이다. 맥에서 한글파일명으로 저장한 파일들을 리눅스에서 받으면 경우에 따라 사용 터미널이 NFD에 대한 자모 조합을 지원해서 제대로 보이거나 보이기는 하나 이상하게 조합되서 보이거나 아예 쭉 풀어져 버리는등 결과를 종잡을 수 없다. 그래서 NFD형식으로 된 한글 파일명을 NFC형식으로 바꾸는 Perl 스크립트를 만들어 봤다.

아는 사람끼리 위 같은 맥의 특성을 풍자하여 "맥부기"라고 부르는데 착안하여 이름은 demacboogi.pl (de맥부기)로 하였다.



위에서 쓰인 모듈들은 Perl에서 기본적으로 포함되는 core모듈이라 별도로 모듈을 설치할 필요는 없음

2011/05/16

Perl 5.14 출시

2011년 5월 14일 Perl 5.14가 출시되었다.
5.14 버젼이기 때문에 5월 14일에 맞춰 출시했다는 소문이~

Perl 5.14 는 Unicode 6.0, IPv6 지원, 더 낮은 CPU,Memory사용, "package Name { ... }" 문법, non-destructive 정규식 지원등 많은 기능이 추가되었다.

공식릴리즈 포스팅:
http://news.perlfoundation.org/2011/05/perl-514.html

바뀐점 정리:
http://search.cpan.org/~jesse/perl-5.14.0/pod/perldelta.pod

여러 뉴스싸이트의 반응:
http://slashdot.org/story/11/05/14/2253215/Perl-514-Released
https://lwn.net/Articles/442938/
http://news.ycombinator.com/item?id=2549077
http://www.reddit.com/r/programming/comments/hbg40/perl_514_is_out/