2010-03-20 3 views
5

나는 몇 시간 동안 펄을 사용하고 있습니다 만, 오늘은이 코드를 건너 온 : 펄이 무슨 뜻 무엇

sub function1($$) 
{ 
    //snip 
} 

?

답변

15

두 개의 스칼라 인수를 취하는 prototype이있는 함수입니다.


아래 주석에 언급 된대로 실제로 Perl 프로토 타입을 실제로 사용하지 않는 것에 대한 강력한 주장이 있습니다. 가장 강력한 인수는 아마도 :

는 2008 년에 StackOverflow에 대한 논의있다 :

MooseX::Method::Signatures 모듈의 교환 가능이있다.

+0

감사합니다. 나는 거의 그것을 알아 냈다. 왜 그것이 필요합니다, 일종의 종류 및 매개 변수에 번호 확인, 그것은 무엇입니까? – sud03r

+0

Perl에는 프로토 타입이 필요하지 않습니다. 그들은 전적으로 선택 사항입니다. 그러나 C 코드에서와 마찬가지로 프로토 타입을 제공하면 오류가 발생하지 않고 감지 할 수 있습니다. 부분적으로 Perl 코더는 프로토 타입없이 Perl 잠수함의 유연성을 (전체적으로 좋게) 활용하고 부분적으로는 Perl 코더가 프로토 타입없이 Perl 잠수함의 유연성을 이용하기 때문에 부분적으로는 내 경험에 비추어 볼 때 자주 사용되지 않습니다. 왜냐하면 사람들은 자동으로 오류를 피하기를 좋아하지 않기 때문에 (그들은 어려운 길을 찾는 것을 선호하는 것 같습니다). –

+3

프로토 타입은 현대 Perl에서 사용되지 않기 때문에 깨졌습니다. 어떻게 깨졌습니까? 다음은 수많은 문제 중 하나를 보여주는 최근의 질문입니다. http://stackoverflow.com/questions/2485106/why-do-printf-and-sprintf-behave-differently 프로토 타입은 유형 확인에 사용되지 않으며, 힌트입니다. 컴파일러 및 Perl은 프로토 타입에 맞도록 호출자의 주장을 억압합니다 *. – rjh

11

다른 대답에 언급 된대로 $$은 프로토 타입을 선언합니다. 다른 대답은 프로토 타입이 무엇인지 말하지 않습니다. 그들은 입력 검증을위한 것이 아니라 파서에 대한 힌트입니다. 이 같은 모호한 무언가를 쓸 때 이제

sub foo($) { ... } 
sub bar($$) { ... } 

:

이 두 기능은 같은 선언 한 상상

foo bar 1, 2 

괄호를 넣어 곳 펄 알고; bar는 두 개의 arg를 취하므로 가장 가까운 두 개의 arg를 소비합니다. 푸 하나 ARG 소요되므로 바의 결과 두 인수 취

foo(bar(1,2)) 

다른 예 :

bar foo 2, 3 

동일한 적용하는 단계; 는 2 줄이 두 개의 인수를 취 얻을 수 있도록 foo는이 하나 개의 인수를 취 그래서 foo(2) 3 얻는다 : "사용하지 않습니다"라고 그래서 기각,

bar(foo(2),3) 

이 펄의 매우 중요한 부분은 당신을하고있다 해로운 일. 거의 모든 내부 함수는 프로토 타입을 사용하므로, 자신의 코드에서 어떻게 작동하는지 이해함으로써 내장 함수가 어떻게 사용되는지 더 잘 이해할 수 있습니다. 그런 다음 불필요한 괄호를 피할 수 있습니다. 그러면 더 깔끔한 코드가됩니다. 나는에 대해 경고합니다 마지막으로

, 하나의 안티 - 패턴 :

package Class; 
sub new ($$) { bless $_[1] } 
sub method ($) { $_[0]->{whatever} } 

당신이 방법 (Class->method 또는 $instance->method)와 같은 코드를 호출, 프로토 타입 검사는 완전히 의미가 없습니다. 코드를 메서드로만 호출 할 수있는 경우 프로토 타입을 추가하는 것은 잘못되었습니다. 이 작업을 수행하는 인기있는 모듈 (hello, XML::Compile)을 보았지만 잘못되었습니다. 그러지 마세요.

sub foo { 
    my ($self, $a, $b) = @_; # $a and $b are the bars to fooify 
    .... 

또는 foo($$) 달리

use MooseX::Method::Signatures; 

method foo(Bar $a, Bar $b) { # fooify the bars 
    .... 

은, 이러한 의미 있고 읽을 수 있습니다 : 당신에 대해 어떻게 전달하는 방법을 많은 인수 문서화하십시오.

관련 문제