2011-12-16 2 views
6

다운로드 한 Perl 모듈을 읽는 동안 다음과 같이 입력 매개 변수를 정의하는 몇 가지 방법을 발견했습니다. 그들 사이의 차이점은 무엇입니까?Perl에서 매개 변수 입력 메커니즘의 차이점은 무엇입니까?

sub new{ 
    my $class = shift; 
    my $self = {@_}; 
    bless{$self, $class}; 
} 

sub count1{ 
    my ($self, $lab1) = @_; 
} 

sub new1{ 
    my ($class, $lab1) = @_; 
    my $self = {}; 
    bless $class, $self; 
} 

sub setpath{ 
    my $self = shift; 
} 

답변

4

서브 루틴이 호출되면 전달 된 매개 변수는 특수 배열 @_에 저장됩니다. my $foo = shift 또는 직접 배열 할당 my ($foo,$bar)[email protected]_; 배열에서 직접 값을 사용할 수도 있습니다. $_[0]

왜 다른 배열 대 하나입니까? 직접 배열 할당이 가장 표준적이고 일반적입니다. 선택적 후행 값이있을 때 때로는 시프트 방식이 사용됩니다. 직접적인 배열 사용법은 몇몇 작은 벽감을 제외하고는 권장하지 않습니다. 특히 래퍼 함수는 다른 함수, 특히 객체 내부를 호출합니다. 다른 함수를 감싸고 입력을 수정하는 함수. 또한 특수 서식 goto &func은 현재 호출 스택을 즉시 삭제하고 현재 값 @_에서 func를 호출합니다.

# use shift for optional trailing values 
use v5.10; 
my $foo = shift; 
my $bar = shift // 'default bar value'; 
my $baz = shift // 'default baz value'; 

#obj method to call related non-object function. 
sub bar { my $self = shift; _bar(@_) } 
sub longname { shortname(@_) } 
sub get { return $_[0]->$_[1]; } 
4

는 # 1, # 3 associating an object with a class (객체 지향 펄)의 예이다.

# 2에서 @_은 함수에 전달 된 매개 변수 목록이므로 $self$lab1은 처음 두 매개 변수의 값을 가져옵니다.

# 12에서 shift()은 어레이를 인수로 사용하여 내장 된 Perl 서브 루틴입니다. 그런 다음 해당 배열의 첫 번째 항목을 반환하고 삭제합니다. 인수가 없으면 암시 적으로 @_에 실행됩니다. 따라서 $self은 처음 전달 된 매개 변수의 값을 가져옵니다.

관련 문제