펄을 이용한 프로그램에서 동작 확인을 하기 위해 로그를 출력하는 경우가 대부분입니다.
특히 문제가 발생했을 경우 로그는 중요한 정보입니다.
그중에서도 어디에서 버그가 발생했는지 확인하려고 할 때 함수명까지 로그에 출력 된다면 문제를 찾는데 많은 도움이 됩니다.
하지만 로그에 함수명을 출력하도록 설정하는 경우, 함수 시작 부분에서 로그 파일에 함수명을 출력하도록 직접 함수명을 작성해두면, 나중에 수정이 발생하거나, 함수명이 바뀌었을 때 다시 작업을 해줘야 하는 번거로움이 있습니다.
Perl에서는 함수에 관한 정보를 얻을 수 있는 함수로 caller가 있습니다.
caller 사용 방법
caller 함수를 호출할 때 파라미터를 설정하지 않고 사용하는 방법과 파라미터를 설정하여 사용하는 방법이 있습니다.
파라미터 미사용
caller 함수를 사용할 때 파라미터를 지정하지 않고 사용할 경우 반환값은 다음과 같습니다.
반환 값은 리스트입니다.
($package, $file, $line) = caller;
0 : 호출한 패키지 이름
1 : 호출한 파일 이름
2 : 호출한 행 번호
변수 $package에 caller 함수를 호출한 패키지 이름, $file에 caller 함수를 호출한 파일 이름, $line에 caller 함수를 호출한 행 번호가 저장됩니다.
파라미터 사용
파라미터
반환 값은 리스트입니다.
0 : 호출한 패키지 이름
1 : 호출한 파일 이름
2 : 호출한 행 번호
3 : 호출한 함수 이름(서브 루틴 이름)
4 : 파라미터 유무(1: 파라미터 있음, 2: 파라미터 없음)
함수명을 취득 하는 방법입니다.
my$func_name = (caller 0)[3];
$func_name =~ s/.*:://;
(caller 0)[3]로 취득한 함수명은 [패키지 이름::함수 이름] 형식으로 되어있습니다.
정규식을 사용하여 [패키지 이름::] 부분을 삭제하고 [함수 이름]만 취득하도록 했습니다.
변수 $func_name에 저장된 값을 로그 파일에 출력을 해주면 로그를 확인할 때 어떠 함수가 동작을 했는지 확인을 할 수 있습니다.
함수 명을 취득하는 caller를 함수로 만들어 사용하고 싶은 경우의 예제입니다.
sub get_func_name {
my $func_name = (caller 1)[3];
$func_name =~ s/.*:://;
}
get_func_name를 만들어 놓고 어디에서든 호출하면 호출한 함수 이름을 취득할 수 있습니다.
주의점으로는 caller 1을 사용해야 합니다.
자기 함수 안에서 자신의 함수 이름을 취득하는 경우에는 caller 0을 사용하지만 get_func_name과 같이 함수로 만들어서 다른 함수에서 취득하는 경우에는 caller 1을 사용합니다.
댓글