The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use lib 't/lib';
use strict;
use warnings;
use Test::More tests => 1;
use Markdown::Pod::Test qw( get_pod markdown_to_pod );

my $file = 't/mkd/2011-12-03.mkd';
is markdown_to_pod($file), get_pod( \*DATA ), "converting $file";

__DATA__
=encoding utf8

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


=head2 저자

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


=head2 시작하며

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


=head2 어떻게?

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

    #!plain
    안녕하세요

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

    #!plain
    00110111101010010001000111010111101000011010100110110111101010010001100100110111001000010001110100110111010110010010100101010000

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

    #!plain
    "   	 				 	 	  	   	   			 	 				 	    		 	 	  		 		 				 	 	  	   		  	  		 			  	    	   			 	  		 			 	 		  	  	 	  	 	 	    "

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


=head2 만들어 봅시다!

먼저 Perl 내부로 읽어들인 문자열을 
L<unpack|http://perldoc.perl.org/functions/unpack.html> 함수를 사용하여 C<'0'>과 C<'1'>의 바이트 시퀀스로 변형합시다.

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

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

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

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

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

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

=for html <img src="http://advent.perl.kr/2011/2011-12-03-1.png" alt="결과" />


=head2 정리하며

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


=head2 참고문서

=over

=item -

L<CPAN의 Acme::Bleach 모듈|https://metacpan.org/module/Acme::Bleach>


=item -

L<s3cr3t gist|https://gist.github.com/1408846>


=item -

L<gypark님의 위키|http://gypark.pe.kr/wiki/Perl/Pack#H_1_7_2>


=item -

L<perldoc pack|http://perldoc.perl.org/functions/pack.html>


=item -

L<perldoc unpack|http://perldoc.perl.org/functions/unpack.html>


=back