슬러 핑없는 서명
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 : 프로토 타입은 서로 다르기 때문에 서명으로 대체 할 수 없습니다.