Friday, May 15, 2009

perl로 만드는 win util / getprint.pl

최근 Perl을 사용한 작업을 다시하면서, 여러가지 유틸리티를 만들면 좋겠다 라는 아이디어가 떠올라 공유할까 합니다.
굉장히 적은 코드로도 꽤 쓸만한 동작을 하는 유틸리티를 작성할 수 있을 것 같기 때문입니다.

■ perl 실행의 기본.

(1) perl 파일의 실행
activeperl이 설치되어 있다면, 커맨드 프롬프트에서 pl 파일 이름만 써도 바로 실행할 수 있습니다.
예를 들어 다음과 같습니다.

C:\>type test.pl
print "hello";
C:\>test.pl
hello
C:\>

(2) 확장명을 쓰지않고 실행하기
그런데 .pl 까지 쓰지 않고 test 만 입력해서 실행하면 안될까요?
환경변수에 그 내용이 적혀 있습니다.

다음 명령중 하나를 커맨드 프롬프트에서 실행해 보면, 바로 실행할 수 있는 확장자를 볼 수 있습니다.

C:\>set | find "PATHEXT"
C:\>set | find /i "pathext"
C:\>set | find /n /i "pathext"

C:\>set | find "PATHEXT"
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.PSC1;.py;.pyw

여기에 다음과 같이 입력하여 확장자가 .pl인 것도 이름만 입력하여도 실행할 수 있게 합니다.

C:\>set PATHEXT=%PATHEXT%;.PL

C:\>test
hello

이때 주의해야할 점은 2가지 인 것 같습니다.
- 실행의 우선순위는 cmd.exe의 내부명령어, 그리고 PATHEXT에 정의된 순서입니다. 만일 dir.pl이 있다면 dir명령은 cmd의 dir명령이 실행됩니다. dir.pl을 실행하려면 확장명까지 다 써줘야 dir.pl이 실행될 것입니다. 또 test.com이 있다면 test.com이 우선권을 가지므로 test.com이 실행될 것입니다.
- 확장명을 떼고 입력해도 실행하게 하는 것은 cmd.exe라는 쉘이 실행할 때 뿐입니다. 만일 totalcmd와 같은 tool에서 바로 test만 실행해서 test.pl을 실행하고 싶다면 그러한 기능을 tool이 지원하지 않는 한, 실행되지 않을 것입니다. (tool이 cmd.exe를 통해서 실행하게 하는 방법은 있습니다.)

(3) 파라메터를 주는 법
기본적인 파라메터를 주는 방법은 다 알고 계실 것입니다. 스페이스로 구분하죠.
그런데 파라메터안에 스페이스를 포함해야하는 경우는 특정 문자로 묶어서 하나의 parameter로 인식하게 해야합니다.

윈도우즈계열에서 이 묶는 문자는 리눅스계열의 것과 약간 다른데,
리눅스계열은 작은따옴표든, 큰따옴표든, 제일 바깥의 것을 pair로 해 parameter로 인식하는 반면,
윈도우계열은 큰 따옴표만을 parameter로 인식합니다.

윈도우즈에서 만일 큰따옴표 안의 parameter안에 큰따옴표를 써야 한다면 역슬래쉬를 붙여 escape화 해주면 됩니다.
이 방법은 리눅스에서도 동일합니다. 즉. 리눅스의 커맨드로 다음과 같은 명령을 본 적이 있다면

perl -MLWP::Simple -e 'getprint "http://www.yaplog.jp"'

윈도우즈에서 실행해보면 다음과 같이 Annoying합니다.
C:\>perl -MLWP::Simple -e 'getprint "http://www.yaplog.jp"'
Can't find string terminator "'" anywhere before EOF at -e line 1.

그래서 윈도우즈에서는 다음과 같이 고쳐서 사용합니다.

C:\>perl -MLWP::Simple -e "getprint \"http://www.yaplog.jp\""

그리고 위 명령은 리눅스계열에서도 잘 동작합니다.

■ getprint.pl
바로 위의 명령을 파일로 해서 간단히 유틸리티를 만들어 두었습니다.
함수명을 파일명과 동일하게 해서 c:\usr\local\bin\getprint.pl 로 저장해 두었습니다.

#!/usr/bin/perl -w
use LWP::Simple;
@ARGV >0 ? getprint $ARGV[0] : print "getprint <url> to get html";

사용방법은 다음과 같습니다.
C:\>getprint http://www.wowkorea.jp
C:\>getprint file:///c:/test.pl


그동안 브라우저를 사용할 수 없는 터미널 환경에서 서버의 작동을 확인할 때
telnet localhost 80
GET / HTTP/1.0<엔터><엔터>

와 같은 방식으로 테스트 했었다면, 이 작은 유틸리티가 쓸모가 있을 것 같습니다.

Tip입니다만, lynx를 사용할 수 있는 환경이면, 다음의 명령도 쓸만합니다.
lynx -dump http://www.wowkorea.jp
lynx -dump -head http://www.wowkorea.jp

■ 혹시 groovy를 사용하세요?
다음 명령을 실행해 보세요
C:\>groovy -e "print \"http://www.wowkorea.jp\".toURL().getText()"

2 comments:

aero's blog said...

perl LWP모듈 깔면 lwp-request 같은 명령이 같이 설치됩니다. 이외에도 lwp-rget, lwp-mirror, lwp-download도 있음

lwp-request [URL] 하면 페이지를 가져와 표준출력으로 뿌려줍니다. windows도 마찬가지고..

UNIX에서는 GET, HEAD, POST라는 명령이 lwp-request와 심볼릭링크가 걸리기 때문에 GET [URL] 해도 됩니다.

Unknown said...

정말이군요!

C:\>which lwp-request.bat
C:\usr\local\Perl\site\bin\lwp-request.bat

좋은 정보 감사합니다.!!
m(__)m