これは、達成しようとしていること、ユーザー入力、ローカル機能、リモート機能のいずれかに大きく依存します。
私はいくつかのパラメータを意味しています。使用しようとすると「検証する」方が簡単です。たとえば、ファイル名を手作業ですべてトラップしようとするのではなく、単にopen .... or die $!
に転送してください。
そして時には「デフォルトとオーバーライドする」方が賢明です。例えば:
my ($first_thing, $second_thing) = @_;
$first_thing //= "default value";
$second_thing //= 0;
注 - //
ではなく||
の使用 - それは、使用中同様のだが、それだけで未定義さをテストする - というよりも、定義された - しかし、偽の''
または0
などされています。
また、検証正規表現のセットを適用することで、検証をさらに改善したい場合もあります。電子メールアドレスやIPアドレスのようないくつかのことは、思ったより徹底的に検証するのがずっと複雑になる可能性があります。
もちろん、その時点でfunction prototypesを見ることもできます。それはあなたが他の言語から考えることがプロトタイピングのようなものではありません。
#!/usr/bin/env perl
#says - must have a single scalar arg.
sub testfunction($) {
my ($required_arg) = @_;
print $required_arg;
}
testfunction(1);
testfunction;
で失敗します後者:
Not enough arguments for main::testfunction
注 - Perlのプロトタイプが引数の種類と数をチェック(例えばスカラーですか、それは配列ですか?)値をチェックしないでください。には、配列を渡す際に予期しない影響があります。
私はあなたができるので、ハッシュに渡すと、デフォルト設定メカニズムに非常によく適していることをお勧めしたい:
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my %defaults = (
"test" => 1,
);
sub with_default {
my %args = (%defaults, @_);
print Dumper \%args;
}
with_default;
with_default(test => 4);
しかし、戻ってあなたのオリジナルケースに行くために - あなたの関数は単純にせずに動作しない場合「の値は、」設定され、それはコードでそれを綴るために良いことだ:
if (not defined $args -> {value}
or not $args -> {value} =~ m/^\w+$/) {
die 'value parameter must be supplied and match m/^\w+$/';
}
それはおそらく、この時点で「汚染」モードを言及する価値があります。 perl
の機能は他の多くの言語では表示されません。
具体的には、 'user supplied'が '汚染されている'と解釈するので、は妥当性検査なしでを使用できません。そして、それは
がperlsec
を参照してくださいしかし、環境等をvarsの、安全でないパスが含まれています
#!/usr/bin/env perl -T
use strict;
use warnings;
system "echo $ENV{'USERNAME'}";
は失敗します - system
は '汚染された' 許可されませんので、varsは。 (しかし、print
の意)。 '汚れ'が削除される前に、検証手順(通常は正規表現など)に渡す必要があります。
関連[サブルーチン引数の検証にはどのようなPerlモジュールが便利ですか?】(https://stackoverflow.com/questions/1433070/what-perl-modules-are-useful-for-validating-subroutine-arguments)と[Perlサブルーチン引数](https://stackoverflow.com/questions/19234209/perl-subroutine-arguments)を参照してください。 –
参照[オプションのサブルーチン引数のデフォルト値を指定する方法は?](http://stackoverflow.com/q/29577085/2173773)および[Perl:名前付きパラメータ検証のベストプラクティス](http://stackoverflow.com/q/19514694/2173773) –