Perlでは、呼び出されたときにパラメータが渡されないとスクリプトがコンパイルされないようなサブルーチンを宣言できますか?サブルーチンに必要なパラメータはどのようにありますか?
私は事のこのタイプは、あなたが現在できる最善についてだと思います答えて
:
#!/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.";
}
}
これは不適切な引数リストが渡されたときにのみ実行時エラー*を生成することに注意してください。私はそのための署名機能は必要ありません。例えば、 'Carpを使う。 ... croak @ "<1>ならば" takesOneOrTwoScalarsの引数が少なすぎます "; croak "takesOneOrTwoScalarsの引数が多すぎる場合" if__> 2' – amon
ことのいくつかはPerlは非常に限られたをサポートし
ある程度、 prototypes (persub)で達成することができます関数のプロトタイプを使用したコンパイル時の引数チェックの種類。
...
は...この機能の目的は、主に、例えば、組み込み関数
のように動作するサブルーチンを定義できるように、sub f1(\@)
とsub f2($$)
として宣言された潜水艦は(f1(@ary)
として呼び出すことができています配列変数、@
)とf2(SCALAR, SCALAR)
があるか、コンパイル時にエラーが発生しています。
しかし、それにははるかに多くの微妙な懸念があります。以下のドキュメントとリンクをお読みください。プロトタイプは、ではなく、のようにコンパイルされた言語の関数シグネチャのようなものであり、そのように見えるかもしれませんが、そのジョブを行うつもりはありません。わずかな誤用でさえ微妙なバグにつながる可能性があります。
FMTYEWTK about Prototypes in Perl(perlmonks)を参照
Understand why you probably don't need prototypes(EffectivePerler)
The problem with prototypes(現代のPerl)
適宜使用される場合、それらは有用であり得ると述べているすべて。 OPのikegamiのコメントを参照してください。
- 1. sdl2.SDL_GetWindowSizeにはどのような関数パラメータを使用する必要がありますか?
- 2. どのようなタイプのmLoaderManagerは、どのように宣言する必要がありますか?
- 3. なぜcrcを反転させる必要がありますか?どのような場合にはこれを行う必要がありますか?
- 4. サブルーチン終了時にプライベートバールはどうなりますか?
- 5. マルチプロトコルプロトコルのドキュメントストリングはどのようにフォーマットする必要がありますか?
- 6. node.jsのJSファイルパスはどのようにする必要がありますか?
- 7. Android:ダイアログの幅はどのようにする必要がありますか?
- 8. どのような場合にクライアントをより正確なURIにリダイレクトする必要がありますか
- 9. クロージャはどのようにフォーマットする必要がありますか?
- 10. コールバックはどのようにPHPDocする必要がありますか?
- 11. 'startActionMode'メソッドはどのように呼び出す必要がありますか?
- 12. webpackはどのように動作する必要がありますか?
- 13. これはどのようにテストする必要がありますか?
- 14. アクティビティスタックはどのように管理する必要がありますか?
- 15. パッケージとはどのように動作する必要がありますか?
- 16. IODEnhUSImageModuleはどのように利用する必要がありますか?
- 17. Zend_Validator_StringLengthはどのように拡張する必要がありますか?
- 18. web.configはどのように展開する必要がありますか?
- 19. ChunkedEncodingErrorはどのように修正する必要がありますか?
- 20. は、どのように私は(または私は必要があります)
- 21. テキストボックスのイベントにどのようにバインドする必要がありますか?
- 22. Scikitでは、パラメータが必要な場合はどうなりますか?
- 23. サブルーチンからサブルーチンに変数をどのように共有できますか?
- 24. protobufのHasField機能にはどのようなパラメータが必要ですか?
- 25. サービスファブリックアクターはどのように関連付ける必要がありますか?
- 26. DateTimeをどのようにする必要はありませんか?
- 27. どのようにユーザーがasp.netにログインする必要がありますか
- 28. セキュリティアーキテクチャでは、どのような必要性がありますか?
- 29. Java 6が必要なアプレットはどこにありますか?
- 30. 必要な宝石はどこにありますか?
'f(@a)'がパラメータを 'f'に渡すかどうかをコンパイル時にどのように伝えることができますか? – ikegami
理論的には、Devel :: CallCheckerやB :: CallCheckerを使って何らかのコンパイル時のチェックを行うことは可能ですが、Perlの内部構造に精通していなければならず、多くの障害モードがあります。例えば。特定のサブルーチン呼び出しでのみ、メソッドでは動作しません。リストコンテキストで引数が評価されても機能しません。 Perlの核心は動的言語です。 Subsは、固定サイズの引数タプルではなく、可変サイズのリストを処理します。私はPythonのようなより動的な言語とは異なり、未知のサブ変数と変数を検出するだけの静的な言語であることをうれしく思っています。 – amon
PPRはどうですか? – simbabque