2014-07-25 3 views
0

Perl 모듈 Module.pm을 사용하는 Perl 스크립트를 작성하고 있습니다.

Module.pm 그렇게 같다 :

package Module; 
use strict; 
use warnings; 

sub getInfo { 

    my $self = shift; 
    #my $var = shift; 

    if (!$self) 
    { 
     my $errmsg = "My ERROR MESSAGE"; 
     return [1, $errmsg]; 
    } 

    return [1, $self]; 
}1; 

그리고 난 그렇게처럼 호출 오전 :

use Module 

my $result = Module::getInfo(); 

하지만 라인에서 (Module.pm에서) FATAL ERROR 정의되지 않은 객체를 점점 계속 #. 왜 그런가요?

getInfo() 서브 루틴의 첫 번째 주석을 제거하고 내 호출 행에 다른 인수를 추가하면 동일한 오류가 발생하지 않습니다. 왜? 서브 루틴을 호출하기 위해 인수로 Module 객체를 보낼 필요가 없다고 생각했습니다.

이것은 Perl 5.8.8을 사용하는 Linux 서버입니다.

+0

'Module.pm은 script.pl 3 행에서 참 값을 반환하지 않습니다 .' - 감소 된 테스트 케이스를 구성 할 때 새로운 오류가 발생하지 않는다면 정말 도움이됩니다. – Quentin

+0

미안하지만, 당신은 단지 1을 더할 필요가 없다. 모듈 끝까지? – Deepak

+0

Module 상단의'package' 라인은 어떻습니까? – Quentin

답변

3

패키지의 멤버 함수를 호출하면 -> 표기법을 사용하는 경우에만 패키지 이름이 암시 적 첫 번째 인수로 전달됩니다. 이를 "메소드 호출"이라고합니다. 클래스 계층 구조를 검색하여 호출 할 대상을 결정할 수도 있습니다. 접두사가 클래스 이름 인 경우 암시 적 첫 번째 인수는 문자열의 패키지 이름입니다. 접두사가 객체 참조 인 경우 암시 적 첫 번째 인수는 해당 객체 참조입니다.

:: 표기법을 사용하면 암시 적 첫 번째 인수가없는 일반 서브 루틴 호출입니다. 예를 들어

:

% cat foo.pl 
#!/usr/bin/perl 

use strict; 
use warnings; 
use v5.10; 

package M { 
    sub getInfo { 
     my($self) = shift; 
     say "\$self = ", ($self // 'undef'); 
    } 

    1; 
}; 

M::getInfo(); 
M->getInfo(); 
% ./foo.pl 
$self = undef 
$self = M 
% 

변경 Module::getInfo()Module->getInfo()합니다.

:

는 펄 문서에 자세히 설명되어있다

Perl의 이전 버전은 perltootperlboot 자습서를 가졌습니다. 그들은(5.20 현재)으로 대체되었습니다.

+0

정말 고마워. 트릭을 했어. 너무 오랫동안 붙어 있었어! – Deepak

+0

그러면 '::'과 '-' '와 같이 모듈을 호출하는 것의 차이점은 무엇입니까? – Deepak

+0

'->'는 암시적인 첫 번째 인수를 전달합니다. '::'은 그렇지 않습니다. –

관련 문제