Saturday, April 25, 2009

ActivePerl의 Tip - 2바이트언어 주석

나는 Windows환경(2003 server)에서 Perl은 ActivePerl을 사용하고 있습니다.

Strawberry Perl을 사용하면 gcc가 함께 있어 CPAN에 있는 많은 모듈을 사용할 수 있는 반면(유닉스 시스템명령어나 네트웍관련 명령어를 사용하는 모듈, 또는 fedora관리용등의 legacy모듈은 사용할 수 없겠죠.),

ActivePerl은 보통 PPM(perl package manager)으로 누군가의 Repository에서 Win32용으로 컴파일된 모듈을 설치해 사용하는 것이 보통이기 때문에, Strawberry Perl보다 제한된 모듈을 사용할 수 있습니다.

그럼에도 불구하고 ActivePerl을 사용하는 이유는(저도 무척이나 Strawberry Perl을 사용하고 싶습니다...만, 진짜 Perl(?)이 필요한 경우는 Fedora10 VirtualPc를 기동시켜 사용하고 있습니다.) ActiveX를 제공하기 때문입니다. Strawberry Perl는 이 것을 제공하고 있지 않습니다. (참조 http://win32.perl.org/wiki/index.php?title=Win32_Distributions)

Perl의 ActiveX지원 기능이 나에게 중요한 이유중에 가장 중요한 이유로는 바로 Emeditor때문입니다. 파일로 저장해 실행하는 방식만이라면 저도 Strawberry Perl을 추천할 것 같습니다.

이 Emeditor 에디터는 WSH를 이용하여 매크로를 작성하는 것이 가능합니다. 즉 VBS, JScript, ActivePerl, ActivePython, PHPScript, RubyScript(ActiveScriptRuby 의 다운로드는 여기 http://arton.hp.infoseek.co.jp/indexj.html)를 이용하여 매크로를 작성하는 것이 가능하게됩니다.

가까운 사람들의 매크로 작성의 참여를 위해, JScript로 선택해 만들기 시작했던 매크로가 점점 기능이 많아져 꽤 도움이 됩니다. (이 기능 때문에 GVim을 떠났고, HappyHacking 키보드도 사용하지 않게 되어버렸습니다. 에디터가 많은 것을 바꾸게 하는군요.) 그런데 매크로 언어로 선택한 JScript로는 가능하지 못한 작업들도 있습니다. 예를 들면, GD라이브러리로 그래프를 그린다던가, ImageMagic으로 이미지를 손대는 매크로는 JScript로는 시도해 보고 싶지 않습니다. 이러한 경우는 ActivePerl을 사용합니다.(아직까지 ActivePython이나 ActiveRuby등은 사용하고 있지 않습니다.)

그런데, ActivePerl에 한글주석이나, 일본어 주석이 있는 경우, 제대로 실행해 내지 못합니다. 예를 들면 다음과 같은 코드(JScript코드입니다.).

var perlcode = "sub main { return \"Perl ! \"; }";
var perl = new ActiveXObject("ScriptControl");
perl.Language = "PerlScript";
perl.AddCode(perlcode);
var result = perl.Run("main");
document.writeln(result);

제가 사용하는 Emeditor매크로에서는 실제로는 위와 같이 사용하지 않고 있습니다만, 위 예제는 Excel등에서 응용하기 좋은 Sample이라고 생각합니다. 제 Emeditor매크로에서는 #language="PerlScript" 이외에도 몇가지 지저분한 코드를 사용해 사용하고 있습니다.


위 코드를 JScript로 실행하면 예상하듯, Perl ! 이라는 출력을 얻을 수 있습니다. (물론 ActivePerl이 설치되어 있어야 합니다.)

그런데 펄의 코드중에 한글로 주석을 달거나 한글을 출력하도록 다음과 같이 수정했을 때, 제대로 실행되지 않습니다.

var perlcode = "sub main { return \"한글\"; }";

나오는 에러코드는 다양했습니다.
Can't find string terminator '"' anywhere before EOF
Illegal division by zero
...그리고 에러가 발생하지 않는 경우도 있었습니다.

이 코드는 테이타를 파일에서 불러오는 경우는 잘 됩니다. 이 경우는 Strawberry Perl이던지 ActivePerl이던지 문제가 없죠.

오늘의 Tip이란 이 부분의 해결입니다. 해결의 Url은 http://miau.s9.xrea.com/blog/index.php?itemid=642 입니다.

원인이라던지 대책은 다음의 URL에 적혀 있습니다만, 이 이야기는 Tip의 내용을 벗어나네요.
http://miau.s9.xrea.com/blog/index.php?itemid=659
http://undine.sakura.ne.jp/diary/d200608b.html#r18
http://www.namazu.org/~tsuchiya/perl/perl-5.8.html#opened_questions

사실. 이 내용이외에도 2바이트 문자열을 사용하는 경우, 조금 더 문제가 있는 듯 합니다. 예를 들면 윈도우즈 환경이다보니, 파일명에 한글을 넣거나 일본어를 넣었을 경우 file handle하는 부분이라던지.... 이 내용은 경험하게 되면 올리도록 하겠습니다. 파일명을 한글, 일본어가 아닌 영어로 적도록 늘 신경을 쓰고 있어서 아직 경험하지 못한 것도 있습니다만, miau님의 블로그에 그 해결내용이 있었던 것이 기억납니다.

여러 언어를 사용하다보면, 역시 각각의 장점이 있다라는 생각이 듭니다. 그것이 컴퓨터 언어든, 자연어든지 말이죠 ;-)

이상. 잘부탁드리겠습니다. m(__)m

No comments: