2015-01-20 1 views
0

일부 펄 함수에서는 다양한 형식의 인수로 작업 할 수 있고 다르게 처리 할 수 ​​있기를 원합니다. 이제이 ref 함수를 사용하고 ref 결과를 기반으로 코드의 적절한 부분을 실행합니다.Perl - 다양한 데이터 형식을 받아들이는 함수를 만드는 방법

sub method_that_accept_various_data_types(){ 
    if (ref $_[0] eq "ARRAY"){ 
    # ... 
    } 
    elsif (ref $_[0] eq "SCALAR"){ 
    # ... 
    } 
    elsif (ref $_[0] eq "HASH"){ 
    # ... 
    } 
} 

내 모든 기능이 패턴을 따라야 또는 내 모든 서브 루틴의 시작 부분에 언급 한 코드를 사용할 필요가 말할 수있는 몇 가지 우아한 방법이 있나요? 나는 절차 적 코드를 작성 중이고 비슷한 것은 OOP의 다형성과 상속이지만이 분야의 초보자입니다.

모든 대답은 새로 생성 된 모든 기능에 코드를 추가해야합니다. 새로운 기능에 코드를 추가 할 필요없이 지금부터 정의 된 모든 기능에 대해이를 수행하는 일반적인 방법이 있는지 묻습니다.

+2

본질적으로 버그가있는 기능을 수행하지 마십시오. – ikegami

+0

왜 그런가요? 더 자세하게 얘기해 주 시겠어요? –

+1

뭔가 해시 및 배열 (등) 수 있기 때문에. 여러 함수를 제공하고 싶지 않다면, 다형성을 인수의 수 또는 인수의 이름에 기반하십시오 ('foo => $ foo' 인수를 사용하는 경우). – ikegami

답변

1

또한 기능/파견 테이블의 해시를 사용할 수 있지만 기본적으로 같은 접근 방식,

sub method_that_accept_various_data_types { 

    my $ref = ref($_[0]); 

    my $func = { 
    ARRAY => sub { 
     print "$ref\n"; 
    }, 
    SCALAR => sub { 
     print "$ref\n"; 
    }, 
    HASH => sub { 
     print "$ref\n"; 
    }, 
    }->{$ref} or return; 

    $func->(@_); 
} 
+0

더 이상'@ _ '에 액세스 할 수 없으므로 익명 하위에'@ _'을 전달하십시오. 댓글을 달려면 –

+0

@ DanielBöhmer tnx. –

+0

최근 편집에서'@ _ '에서 관심있는 첫 번째 요소를 제거하고 하위로 전달하지 않습니다! '$ _ [0]'에 집착하십시오. –

0

당신은 내가 추가하고있어 Switch module

use Switch; 

sub polymorph_function { 
    my ($arg1, $arg2, ...) = @_; 

    switch (ref $arg1) { 
     case 'ARRAY' { ... } 
     case 'HASH' { ... } 
     ... 
    } 
} 
+1

스위치를 권장하지 않습니다. 소스 필터이므로 이상한 버그가 발생할 수 있습니다. – choroba

+0

코드가 Perl 5.10.1 이상에서만 실행된다는 것을 알고 있다면 [switch '기능] (http://perldoc.perl.org/perlsyn.html#Switch-Statements)을 사용할 수 있습니다. 거의 같지만 키워드가 다르다. 'for'또는 'given'과 'when'. –

0

에서 switch 문을 사용할 수 있습니다 이것은 개인적으로 나쁜 코드라고 생각하기 때문에 Сухой27의 예제를 추가 답변으로 삼았습니다. 당신이 짧은 코드를 선호한다면 당신은 그것을 좋아할 것 : 더 임시 변수가없는 것을 제외하고

sub polymorph_function { 
    ({ 
     ARRAY => sub { ... }, 
     HASH => sub { ... }, 
     ... 
    }->{ref $_[0]} || return)->(@_); 
} 

그것은 기본적으로 동일합니다. 익명의 해시를 생성하고 참조가 직접 참조 해제되며 ref $_[0] (첫 번째 인수의 유형)을 기반으로 선택된 적절한 키가 선택됩니다. 그 결과 서브 다이어그램 중 하나에 대한 결과 코드 레터가 즉시 원래 서브 코드에 대한 모든 인수와 함께 호출됩니다.

+1

맞습니다. 압축 된 코드는 더욱 악화됩니다 :-) –

-1

저는 많은 코드를 중앙 위치로 옮기는 방법에 대해서만 생각했습니다.

sub polymorph_function { 
    poly \@_, (
     ARRAY => sub { ... }, 
     HASH => sub { ... }, 
     ... 
    ); 
} 

sub poly { 
    my ($args, %subs) = @_; 

    my $sub = $subs{ref $args->[0]} or return; 
    $sub->(@$args); 
}