Title:    소스코드 감쪽같이 숨기기
Package:  Seoul.pm
Category: perl
Category: Seoul.pm
Author:   aanoaa


저자
-----

[@aanoaa][twitter-aanoaa] - Perl, 콧수염, 야구, 자전거, 낙타, 돌고래, 포청천 마니아.
아이유 열혈 삼촌팬. Perl과 Javascript, 안드로이드 어플리케이션 개발에 능하다.
Perl 코드 사용시 탭 문자 대신 4칸 공백을 사용한다.
일신 상의 이유로 Vim을 버리고 Emacs로 투신.
현재 [콧수염 블로그][aanoaa-blog]를 운영하고 있다.



시작하며
-------

Perl 코드를 실행할 수 있다는 것은 소스 코드도 읽을 수 있다는 것을 뜻합니다.
하지만 단 몇 줄의 Perl 코드로 여러분의 코드를 감쪽같이 숨길 수도 있습니다.



어떻게?
--------

먼저 숨기고자 하는 문자열을 비트스트림으로 보고 `'0'`과 `'1'`로만 이루어진 문자열로 바꿉니다.
그런 다음, 이것을 다시 공백(`" "`)과 탭(`"\t"`)으로만 이루어진 문자열로 바꿉니다.
그러면 여러분의 코드는 아무리 모니터를 뚫어지게 쳐다봐도, 백번 인쇄를 해도 읽어낼 수 없게 됩니다!
예를 들어 아래와 같은 내용이 주어졌다면,

    #!plain
    안녕하세요

먼저 이렇게 `0`과 `1`로만 이루어진 문자열로 바꿉니다.

    #!plain
    00110111101010010001000111010111101000011010100110110111101010010001100100110111001000010001110100110111010110010010100101010000

그리고 `0`과 `1`을 각각 공백과 탭 문자로 바꾸면 읽을 수도 없고 인쇄할 수는 문자열이 완성됩니다!

    #!plain
    "  		 				 	 	  	   	   			 	 				 	    		 	 	  		 		 				 	 	  	   		  	  		 			  	    	   			 	  		 			 	 		  	  	 	  	 	 	    "

보이지 않게 된 문자열을 큰 따옴표로 묶은 모습입니다.



만들어 봅시다!
--------------

먼저 Perl 내부로 읽어들인 문자열을 
[unpack][perldoc-unpack] 함수를 사용하여 `'0'`과 `'1'`의 바이트 시퀀스로 변형합시다.

    #!perl
    my $text = <STDIN>;
    $text = unpack "b*", $text;

다음으로 `'0'`은 `' '`로, `'1'`은 `"\t"`로 바꿉니다.

    #!perl
    $text =~ tr/01/ \t/;

이게 끝입니다!
전체 코드로 한번 볼까요?

    #!perl
    my $text = <STDIN>;
    $text = unpack "b*", $text;
    $text =~ tr/01/ \t/;
    print $text;

결과 화면은 다음과 같습니다.
`"Hello Susan!"`을 입력하면 빨간 박스에
표시한 부분만큼 공백이 출력된 것을 볼 수 있습니다.

![결과][img-01]



정리하며
--------

역순으로 실행하면 `' '`와 `"\t"`로 이루어진 텍스트를
원상태로 복구할 수 있을 겁니다.
Perl을 사용하면 이렇게 간단하게 문자열을 조작할 수 있습니다.
문서와 명령행 옵션이 깔끔하게 포함된
[s3cr3t 전체 소스코드][gist-s3cr3t]도 꼭 확인해보세요.



참고문서
---------

- [CPAN의 Acme::Bleach 모듈][cpan-acme-bleach]
- [s3cr3t gist][gist-s3cr3t]
- [gypark님의 위키][gypark-wiki-pack]
- [perldoc pack][perldoc-pack]
- [perldoc unpack][perldoc-unpack]



[img-01]:           http://advent.perl.kr/2011/2011-12-03-1.png

[cpan-acme-bleach]: https://metacpan.org/module/Acme::Bleach
[perldoc-pack]:     http://perldoc.perl.org/functions/pack.html
[perldoc-unpack]:   http://perldoc.perl.org/functions/unpack.html
[gypark-wiki-pack]: http://gypark.pe.kr/wiki/Perl/Pack#H_1_7_2
[gist-s3cr3t]:      https://gist.github.com/1408846
[twitter-aanoaa]:   http://twitter.com/#!/aanoaa
[aanoaa-blog]:      http://aanoaa.github.com/
