화면에 쓰기(print)

우리의 첫 번째 프로그램인 hello.pl을 떠올려 봅시다.
print "Hello World\n"가 전부였죠.

좀 더 긴 인사를 해볼까요 ?

# heylong.pl
# 앞에는 아무 공백도 없다고 생각하십시요.

 print <<end_of_hello;
Hello world.\n
I am here to serve you but not to conquer.
There were many kings and queens in the world,
but I want to be a real friend of yours.
end_of_hello

print "Ending our greeting\n";
조금 다르지만 똑똑하신 우리 대한의 아들, 딸, 아짐, 아재, 할머니, 할아버지들은 이미 알아 차리셨군요.

print 다음에 나오는 <<end_of_hello는 따라오는 문장을 print하는데 있어서 첫 end_of_hello (또는 여러분이 정하는 그 무엇, THATSALL 이나 HE_HE_HE등)가 나올 때까지 멈추지 않는 것이죠.

여기서 주의할 것이 있습니다.
위 예제의 경우 end_of_hello는 그 앞이나 뒤에 아무런 글자도 없어야 합니다. 공백도 물론 없어야 합니다. 대개 프로그램을 만드는 사람들은 들여쓰기(indent)를 사용하여 소스의 가독성을 높이려 합니다. 그러나 위와 같이 <<xxxx 를 사용할 경우는 반드시 들여쓰기를 무시하여 작성해야 합니다. 즉,

  print "Say yes or no : ";
  $answer = <STDIN>;
  chomp $answer; # $answer 뒤에 따라붙는 \n을 잘라냅니다.
  if( $answer eq 'yes' ) {
    print
 <<EOY;
You said $answer.
I will keep going on.
EOY
  }
  else { print "You said 'No.'\n"; }
와 같이 해야합니다.

잠깐!!

만일 <<EOY 대신에 <<'EOY'를 사용했다면 $answer는 그 값으로 치환되지 않고 문자열 '$answer'로 인식이 됩니다. 마치 print "$answer" 대신에 print '$answer';를 사용한것과 같습니다.
<<"EOY"<<EOY과 같이 적용됩니다.

직접 실행시켜 보십시오. 저는 예제를 별도 파일로 저장해 드리고 싶지 않습니다. 직접 자판을 두드려 보는 것은 문장의 구조를 손에 익게 하는 효과가 있다고 생각되기에 여러분의 귀중한 기회를 빼앗고 싶지 않은거지요.

print 함수의 인자인 문자열에는 변수가 삽입될 수 있습니다. 일반변수에 대하 여 이야기하던 중에 잠깐 나왔었죠.

print "$price\n";
에서 문자열 "$price\n"안의 $price는 그 변수에 정해져있는 값으로 치환됩니다. 만약 $price가 135 였다면
135
이라고 결과가 나오지요.

그러나 문자열을 싸고있는 따옴표가 ' '일 경우에는 다릅니다. 그 결과는

$price\n
과 같이 변수는 물론 개행문자(\n)까지도 치환(확장)되지 않고 문자 그대로 나오는 현상이 발생합니다. 다음을 보시고 결과를 상상해 보세요.

print '$price = ', "$price\n";
print 함수는 복수의 인자를 모두 인식하며, 각 인자는 쉼표(,)로 분리됩니다. 그래서 위의 명령행이 실행 되는 거지요.

한가지 더 있습니다. 역으로 찍히는 따옴표가 있지요 ? 자판의 ESC 누름쇠 바로 밑에 ~와 함께 있는 ` 기호입니다. 이 기호에 둘러 쌓이면 그 문자열은 시스템 명령으로 간주되어 실행 되어집니다. 그 결과가 print 되는 거지요.

print `cd`; # 유닉스 아재/아짐들은 `pwd` !!
윈도우즈에서 cd 명령은 현재 폴더를 출력합니다.(유닉스는 pwd)

배열(array)을 print하면, 쌍따옴표를 이용할 경우 각 요소 사이에 공백문자가 하나씩 끼워져서 프린트되고, 따옴표를 사용하지 않으면 끼이는 문자없이 주욱 연결되어 출력됩니다. 그러나 hash (associative array, 잡동사니)는 치환이 되지 않아요.

@heys = ( "Hello", "there", "I\'m", "O.K.", "\n" ); # 달팽이는 array
print "@heys";
 # 배열을 풀어봅시다. (;를 빼 먹으면 안돼는 것 아시죠 ?)
print @heys;
 # 그다지 우아하지 않은 모양의 출력을 볼수 있습니다.
%fruits = ( "apple", 3, "pear", 5, "banana", 2 );
 # %는 잡동사니 hash !
print "%fruits\n"; # 어떻게 될까요 ?
결과는 상상해보세요. 상상이 안되시면 직접 실행시켜 보시고요.

특수한 문자들을 문자열에 포함시키기

지금까지의 예문들을 보면 가끔 이상한 기호를 문자열 안에 집어 넣는 경우가 있었지요 ? 예를 들면 \n 같은것 말입니다. 문자열은 보통 "", '', ``로 둘러 쌉니다. 그렇다면 문자열 내에 그러한 따옴표들을 집어 넣으려면 조금은 다른 방법을 써야겠지요. 그렇지 않고
print "The quotation mark is ".\n";
와 같이 하면 Perl은 에러 메시지를 내고 실행을 중지합니다.
왜냐하면 문자열은 The에서 시작하여 is뒤의 공백에서 끝나고 그 뒤는 문법에 맞지않는 쓰레기(\n")이기 때문이죠. 그래서
print "The quotation mark is \".\n";
와 같이하면 \"가 문자열을 둘러싸는 기호로서의 "가 아닌 "문자 그 자체인것을 알고 순순히 실행이 됩니다. '와 `의 경우도 마찬가지입니다.

또 \n과 같이 문자의 모양이 지정되어있지 않은 문자들은 각기 다른 방법이 있습니다. 단 슬래쉬(\)를 사용한다는 점이 같은점입니다. 다음은 그러한 특수문자들입니다. 참고 삼아 보십시오.

\t 탭
\n 개행문자. 커서를 다음 줄 앞으로 보냄.
\r 커서를 현 라인의 맨 앞으로 보냄.
\f form feed
\v vertical tab, whatever that is
\b backspace
\a alarm (bell) 삐이.
\e escape
\033 octal char
\x1b hex char
\c[ control char
\l lowercase next char
\u uppercase next char
\L lowercase till \E
\U uppercase till \E
\E end case modification
\Q quote regexp metacharacters till \E

\r를 사용한 심심풀이 땅콩같은 예제 하나 드릴께요.
# hack.pl

$a = "H A C K E R ";
$len = (length $a)-1;

print "$a\r";
for ( 0..3 ) {
  for ( 0..$len) {
    $s1 = substr( $a, 0, $_ );
    $s2 = substr( $a, $_+1 );
    print "$s2$s1\r";
    sleep 1;
  }
}
print "\n";

이전 | 목록 | 다음
Comments