전종필 서브루틴에서 여러개의 배열을 반환하면 모든 배열이 하나로 뭉뚱그려집니다. 그래서,
(@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);
}
|