2012년 7월 12일 목요일

[Perl programming #1] my()를 이용한 변수 선언

[들어가는 글]

펄(Perl)을 업무에 활용한지도 꼭 12년째가 되어 간다. 내가 펄을 처음으로 공부하면서 접한 교재는 인터넷에서 찾아서 인쇄한 Russell Quong의 "Perl in 20 pages" version 2000c와 "Robert's Perl Tutorial Version 4.1.1"이다. 이 문서들이 아직도 인터넷 공간에 살아 있는지는 모르겠다. Univ. of Washington의 Phred/Phrap/Consed에 포함되어있는 스크립트가 조금씩 펄 스크립트 작성 실력을 키우면서 정말 큰 도움이 되었던 재료들이었다. 이제는 [펄 쿡북]을 참조하면서 필요한 부분은 그때마다 참조하고 있지만, 알고리즘이나 데이터 구조에 대한 깊이 있는 지식 없이 그저 필요한 기능만 구현하는데 집중하다 보니 항상 아쉬움이 많았다. 이러한 아쉬움을 달래고자, 조금 더 진지하게 펄을 공부해 보기로 하였다. 지금부터 내가 추구하는 것은 깔끔하고, 문법적으로 정확하며, 읽기 쉽고, 재사용이 가능한 펄 코드를 짜는 것이다.

[변수 초기화]

나에게는 아주 나쁜 버릇이 있다. 변수를 선언하는데 매우 불성실하다는 것이다. use strict나 my()라고 몇 자 더 치는 것을 게을리하여 오류가 난 코드를 고치는데 무척 애를 먹기도 한다. 변수명을 잘못 기입하면 오류의 원인을 찾기가 매우 어렵다.

#!/usr/bin/perl

use strict;
use warnings;

이렇게 스크립트를 시작하는 것과,

#!/usr/bin/perl -w

use strict;

이렇게 쓰는 것은 본질적으로 같(을 것이)다.

use strict 디렉티브를 사용하면, 모든 변수는 my()를 써서 선언해야 한다. 변수의 선언과 초기화는 다르다. 괄호를 언제 써야 하는가? 다음의 사례를 보라.

my $foo;  # 이것은 선언만 하는 것
my $foo = 123; # 선언과 초기화를 동시에
my ($foo, $bar); # 여러 변수를 한번에 선언

초기화하지 않은 변수가 갖는 값은 undef이다. 그러나 이는 $var eq undef 처럼 비교할 수 있는 것이 아니다. 그리고 undef는 엄연히 말하자면 null character 혹은 숫자로서의 0과는 다르다.

변수의 선언과 초기화가 다르다는 것을 다음의 스크립트에서 확인해 보자.


#!/usr/bin/perl

use strict;
use warnings;

my $foo;

if (defined $foo) {
    print 'Var $foo is defined!', "\n";
} else {
    print 'Var $foo is not defined!', "\n";
}

상세한 설명은 Perl 공식 문서의 Private Variables via my () 섹션을 참조하자. 참고로 이 마지막 문장은 이 글을 쓴지 10년이 지난 2022년 3월 13일에 추가하였다.

댓글 없음: