2 posts tagged “perl”
Perl도 다른 스크립트 언어들과 마찬가지로 스트링을 편하게 입력하기 위해 다중행 입력을 지원합니다.
다음과 같이 하여 $script1이란 변수에, END_OF_STRING 이 나타나기 전까지의 여러 행으로 이루어진 [ SELECT aa,bb,cc,... ............ ; ] 를 한번에 넣을 수 있습니다.
$script1 = <<"END_OF_STRING";
SELECT aa,bb,cc,...
FROM (
SELECT a.*,
(CASE @vid WHEN a.aa THEN @rownum:=@rownum+1 ELSE @rownum:=1 END) rnum,
(@vid:=a.aa) vid
......
;
END_OF_STRING
그런데 Perl에서 @는 배열을 나타내므로, 위와 같이 쓰면 @vid 또는 @rownum 과 같이 쓴 부분에서는 실제 프로그램상에서 정의한 배열을 참고하게 됩니다. 당연히 저런 이름의 배열을 프로그램에서 쓴 적이 없으니까 에러가 나고요.
그러면 위와 같이 정의한 스트링이 말 그대로 문자열이며 치환이 절대 안 일어나게 하려면?
간단히 다음과 같이 쓰면 됩니다.
$script1 = <<'END_OF_STRING';
SELECT aa,bb,cc,...
END_OF_STRING
스트링 끝을 지정하는 문자열을 둘러싼 따옴표를 홑따옴표로 바꾸면 됩니다.
원래 $a="$a" 와 같이 문자열을 쌍따옴표로 둘러싸면 치환이 일어나고 $a='$a' 홑따옴표로 둘러싸면 치환이 일어나지 않는데, 다중행스트링의 경우 이런 식으로 끝 지정 문자열을 둘러싸는 따옴표의 종류에 따라 처리하도록 만든 게 참 재치있다는 생각이 듭니다.
stackoverflow.com 에 같은 질문이 올라와 있는데 답변이 제각각이네요. 무슨 모듈을 써야 된다거나 템플릿을 써야 된다거나... 질문자가 원한건 간단한 것이었는데 답변은 마구 복잡해집니다.^^ 5개의 답변 중 2번째 답변을 보고 답을 얻어서 이 글을 쓰게 되었습니다.
가끔씩 Higher Order Perl 을 공부합니다. 자주는 못 하고.
그냥 슥 볼 수도 없거니와 한 번 보고 지나가서는 바로 잊어먹을 내용이기 때문에 복습을 위해서 스프링노트에 기록해 두고 있습니다.
혹 이 책을 공부하시는 분께 도움이 될지도 몰라서 아직 분량은 얼마 안 되지만 공개해 놓았습니다. 틈틈이 노트를 쓰도록 하겠습니다.