서브루틴에서 문맥에 따라 다른 값 반환하기

전종필

다음과 같은 localtime 함수 호출을 본적이 있을 것입니다.

$timestr = localtime; # "Wed May  1 21:38:17 2002"
@timestruct = localtime; # ( 17, 38, 21, 1, 4, 102, 3, 120, 0 )
localtime 함수는 문맥에 따라 다른 내용을 반환합니다.
스칼라문맥에서는 현재 시각을 문자열로 반환하고, 목록문맥에서는 초, 분, 시, 날짜, 월-1, 년-1900, 요일, 1월 1일부터의 날 수 - 1, 일광절약시간(참|거짓) 을 반환합니다.

서브루틴에서도 이와 같이, 서브루틴이 사용되는 문맥을 파악하여 서로 다른 값, 또는 같은 값을 서로 다른 형식으로 반환할 수 있습니다.
보통은, 목록문맥에서는 목록, 배열 혹은 해쉬를, 스칼라문맥에서는 배열 혹은 해쉬의 리퍼런스를 반환하기 위해 사용되는데, wantarray 함수를 사용합니다.


$txt = "name=Larry&work=Perl";
$href = parse($txt); # 스칼라문맥
print "Name: $href->{name}\n";
%hash = parse($txt); # 목록문맥
print "Name: $hash{name}\n";

sub parse {
	return unless defined wantarray; # 반환받는 형식이 아니면, 아예 아무것도 하지 않고 싶을때..
	my $txt = shift;
	my %hash = map { split(/=/, $_, 2) } split /&/, $txt;
	wantarray ? %hash : \%hash; # 목록문맥이면 해쉬를, 그렇지 않으면 해쉬의 리퍼런스를...
}
이 방법을 사용하여, 모듈 혹은 패키지 개발자는 사용자의 다양한 프로그래밍 스타일에 부응할 수 있습니다. 
Comments