슬러 핑없는 서명

Sep 08 2020

이것은 이미 작동하는 코드에 대한 질문입니다! 여러 배열을 입력으로 사용하는 많은 서브 루틴이 있습니다.

use 5.24.0;
use feature 'refaliasing';
no warnings "experimental::refaliasing";
my (@foo,@bar,@baz);
sub sumarr (\@\@);

# other code to load arrays

sub sumarr (\@\@)
  { my (@sum, @aa, @ab);
    (\@aa,\@ab)=@_;
    $sum[$_] = $aa[$_] + $ab[$_] for 0 .. $#aa;
    return @sum;
    }

... 간단하게 호출 할 수있는

@baz = sumarr( @foo, @bar);

프로토 타입을 서명으로 대체하거나 적어도 인수 목록을 간소화하기 위해 서명으로 프로토 타입을 보강하는 방법을 찾지 못했습니다. 아직 그런 일이 있습니까?

답변

2 tobyink Sep 09 2020 at 00:04

시그니처 @_는 함수 내에서 범위가 지정된 어휘 변수로 압축 을 풉니 다 . 프로토 타입은 함수 호출이 구문 분석 되는 방식에 영향을줍니다 . 그래서 그들은 다른 일을합니다 – 당신은 단지 하나를 다른 것으로 대체 할 수 없습니다. (두 가지가 모두있는 함수를 작성할 수 있습니다.)

구문 분석에 영향을 미치는 프로토 타입 그림입니다.

use strict;
use warnings;
use Data::Dumper;

my @a = ( 1 );
my @b = ( 2 );

myfunc( @a, @b );

sub myfunc (\@\@) {
    print Dumper( @_ );
}

myfunc( @a, @b );

공지 사항 myfunc같은 인수로 두 번 호출됩니다 아직 다른 출력을 생성합니다. 를 사용 use warnings하면 Perl은 적어도 잠재적으로 이상한 일을하고 있다고 경고합니다.

앞서 언급했듯이 동일한 기능에 대해 서명과 프로토 타입을 모두 선언 할 수 있습니다.

sub myfunc ( $A, $B ) :prototype(\@\@) {
    print Dumper( @_ );
}

(서명은 아직 실험적이며 최근에 서명과 프로토 타입이 선언되는 순서를 바꿨다고 생각합니다! 실험적 기능을 조심해야하는 이유입니다.)

TLDR : 프로토 타입은 서로 다르기 때문에 서명으로 대체 할 수 없습니다.