Tips in Action‎ > ‎배열과 Hash‎ > ‎

여러개의 배열이나 해쉬 반환하기(서브루틴)

전종필

서브루틴에서 여러개의 배열을 반환하면 모든 배열이 하나로 뭉뚱그려집니다. 그래서,

(@ltime, @gtime) = lgtime();
print "ltime : @ltime\n";
print "gtime : @gtime\n";

sub lgtime {
	my @lmt = localtime;
	my @gmt = gmtime;
	(@lmt,@gmt);
}
얼핏보면 제대로 될 것 같지만 실제로 출력되는 내용은

ltime : 7 14 11 7 4 102 2 126 0 7 14 20 7 4 102 2 126 0
gtime :
입니다.
결국 서브루틴 내부에서는 @lmt와 @gmt로 둘이였던 배열이 반환되면서 하나로 뭉쳐져 앞쪽의 배열에 모두 들어가게 된 것이지요.
이 것을 해결하려면 리퍼런스를 사용해야 합니다. (배열의 배열에 리퍼런스에 대한 내용이 나와 있습니다.)

($rltime, $rgtime) = lgtime();
print "ltime : @$rltime\n"; # ltime : 7 19 11 7 4 102 2 126 0
print "gtime : @$rgtime\n"; # gtime : 7 19 20 7 4 102 2 126 0

sub lgtime {
	my @lmt = localtime;
	my @gmt = gmtime;
	(\@lmt,\@gmt); # 리퍼런스의 목록을 반환
}
위와 같이 리퍼런스의 목록을 반환하고, 받는 쪽에서는 이 목록을 받아들인 후, 적절히(@$rltime처럼) 사용하는 것입니다.
해쉬의 경우도 마찬가지입니다.

($ra, $rb) = hashes();
# 어쩌고 저쩌고...

sub hashes {
	my %a = qw( a 1 b 2 c 3 );
	my %b = qw( A 1 B 2 C 3 );
	(\%a, \%b);
}
Comments