正しい機能はdefined
です。 undef
は未定義$optional
です。何がやりたいことは、このようなものです:
sub MyFunc {
my $length = shift;
my $optional = shift // 'Default Value';
# Do your stuff here.
}
:それは(特にPerlの5.10+)に対処するための
sub myFunction {
my($length, $optional) = @_;
if(! defined $optional) {
# Do whatever needs to be done if $optional isn't defined.
}
else {
# Do whatever can be done if $optional *is* defined.
}
}
別の方法として、このように、「定義されたか」演算子、//
を使用することです
戻り値がshift @_
であるかどうかを検出します。すでにshiftを1回呼び出したので、2番目のパラメータをテストしています。定義されている場合は、値を$optional
に割り当てます。定義されていない場合は'Default Value'
に$optional
を割り当ててください。もちろん、あなたは自分の正気のデフォルトを考えなければなりません。あなたは前のPerl 5.10の暗黒時代に立ち往生している場合は
、あなたと同じ達成できます
my $optional = shift;
$optional = defined $optional ? $optional : 'Default value';
...か...
my $length = shift;
my $optional = defined($_[0]) ? shift : 'Default value';
いずれかの方法で、私はしばしば、完全に別個の制御フローパスではなく、正常なデフォルトを持つことを好みます。これはしばしばコードを単純化するための良い方法です。
を呼び出すときに、これが混乱になるだろう、パラメータをオフにシフトし、これは危険なコードです引数の数を取る:スカラー(@_)。 'foo(4、undef)'を呼び出すと、2つの引数を渡します。 –
これは、未定義の値のテストが['undef']ではなく[' not defined'](http://perldoc.perl.org/functions/defined.html)であるためです(http://perldoc.perl.org /関数/undef.html)。 – hd1