Perl called too early to check prototype 에러

펄 실행 중 called too early to check prototype 에러 메시지가 나오는 경우 원인과 해결 방법을 알아보겠습니다.

에러 내용은 서브 루틴이 프로토타입 체크보다 빨리 호출되었다는 경고입니다.

간단하게 설명을 하면 서브 루틴, 즉 사용자가 작성한 함수보다 호출 부분이 먼저 작성되어 있어서 경고 메시지가 표시되는 경우가 많습니다.

우선 서브 루틴을 사용하여 함수를 만들고 정상적으로 호출되는 경우를 보겠습니다.

#! /usr/local/bin/perl
# sampleTest.pl

use strict;
use warnings;
use 5.10.0;

sub mySub () {
	my $n = shift;
	my $m = shift;

	return $n ** 2 + $m ** 2;
}

my $ret = mySub(2, 3);
print "반환값은 $ret 입니다.";

 

결과

반환값은 13 입니다.

 

mySub 함수를 작성하고 함수를 호출하고 있습니다.

실행 결과에도 에러 메시지나 경고 메시지가 표시되지 않습니다.

반대로 함수를 호출하는 부분을 먼저 작성하고 함수를 아래 작성하여 실행해보겠습니다.

#! /usr/local/bin/perl
# sampleTest.pl

use strict;
use warnings;
use 5.10.0;

my $ret = mySub(2, 3);
print "반환값은 $ret 입니다.";

sub mySub () {
	my $n = shift;
	my $m = shift;

	return $n ** 2 + $m ** 2;
}

 

결과

main::mySub() called too early to check prototype at /home/cf/perl/sampleTest3.pl line 8.
반환값은 13 입니다.

 

실행은 되지만 경고 메시지가 표시되고 있습니다.

Perl은 main() 함수 가 없기 때문에 위에서부터 순서대로 실행이 됩니다.

이러한 이유로 경고 메시지가 표시되는 것입니다.

보통 코드를 작성할 때에 메인이 되는 처리 부분을 위에서부터 작성하고 처리에 필요한 함수를 아래에 추가하는 형식으로 작성을 많이 합니다.

함수를 모아두는 것이 보기에도 편하고 찾기도 편하기 때문입니다.

그러면 경고 메시지를 없애기 위한 해결 방법을 보도록 하겠습니다.

함수 호출 부분을 먼저 작성하고 사용자 함수가 아래에 있는 경우에는 함수 호출 부분에 &를 붙여줍니다.

#! /usr/local/bin/perl
# sampleTest.pl

use strict;
use warnings;
use 5.10.0;

my $ret = &mySub(2, 3);
print "반환값은 $ret 입니다.";

sub mySub () {
	my $n = shift;
	my $m = shift;

	return $n ** 2 + $m ** 2;
}

 

결과

반환값은 13 입니다.

 

프로토타입 체크가 발생하는 경우에는 함수 호출 부분에 &를 붙여서 사용하면 경고 메시지를 없앨 수 있습니다.

댓글