2017-10-11 4 views
2

Perlでは、呼び出されたときにパラメータが渡されないとスクリプトがコンパイルされないようなサブルーチンを宣言できますか?サブルーチンに必要なパラメータはどのようにありますか?

私は事のこのタイプは、あなたが現在できる最善についてだと思います
+2

'f(@a)'がパラメータを 'f'に渡すかどうかをコンパイル時にどのように伝えることができますか? – ikegami

+0

理論的には、Devel :: CallCheckerやB :: CallCheckerを使って何らかのコンパイル時のチェックを行うことは可能ですが、Perlの内部構造に精通していなければならず、多くの障害モードがあります。例えば。特定のサブルーチン呼び出しでのみ、メソッドでは動作しません。リストコンテキストで引数が評価されても機能しません。 Perlの核心は動的言語です。 Subsは、固定サイズの引数タプルではなく、可変サイズのリストを処理します。私はPythonのようなより動的な言語とは異なり、未知のサブ変数と変数を検出するだけの静的な言語であることをうれしく思っています。 – amon

+0

PPRはどうですか? – simbabque

答えて

1

#!/usr/local/bin/perl -w 
use strict; 
require 5.020; 
use warnings; 
use feature qw(say signatures); 
no warnings "experimental::signatures"; 

print "Enter your first name: "; 
chomp(my $name1 = <STDIN>); 

print "Enter your last name: "; 
chomp(my $name2 = <STDIN>); 

say "Calling takesOneOrTwoScalars with 2 args"; 
takesOneOrTwoScalars($name1, $name2); 

say "Calling takesOneOrTwoScalars with 1 arg"; 
takesOneOrTwoScalars($name1); 

say "Calling takesOneOrTwoScalars with 0 args"; 
takesOneOrTwoScalars(); 

sub takesOneOrTwoScalars($firstName, $lastName="") 
{ 
    print "Hello, $firstName"; 
    if ($lastName) 
    { 
     say " $lastName"; 
    } 
    else 
    { 
     say ", I see you didn't give your last name."; 
    } 
} 
+3

これは不適切な引数リストが渡されたときにのみ実行時エラー*を生成することに注意してください。私はそのための署名機能は必要ありません。例えば、 'Carpを使う。 ... croak @ "<1>ならば" takesOneOrTwoScalarsの引数が少なすぎます "; croak "takesOneOrTwoScalarsの引数が多すぎる場合" if__> 2' – amon

2

ことのいくつかはPerlは非常に限られたをサポートし

ある程度、 prototypes (persub)で達成することができます関数のプロトタイプを使用したコンパイル時の引数チェックの種類。
...
は...この機能の目的は、主に、例えば、組み込み関数

のように動作するサブルーチンを定義できるように、sub f1(\@)sub f2($$)として宣言された潜水艦は(f1(@ary)として呼び出すことができています配列変数、@)とf2(SCALAR, SCALAR)があるか、コンパイル時にエラーが発生しています。

しかし、それにははるかに多くの微妙な懸念があります。以下のドキュメントとリンクをお読みください。プロトタイプは、ではなく、のようにコンパイルされた言語の関数シグネチャのようなものであり、そのように見えるかもしれませんが、そのジョブを行うつもりはありません。わずかな誤用でさえ微妙なバグにつながる可能性があります。

適宜使用される場合、それらは有用であり得ると述べているすべて。 OPのikegamiのコメントを参照してください。

関連する問題