2013-02-09 8 views
12

2つの変数をperl関数に渡すことを計画しています。その1つはオプションです。私は、2番目のものが定義されているかどうかをチェックしようとしていますが、正しく動作しません。関数をmyFunction(18)として呼び出すと、変数$ optionalが定義されているとみなされ、elseステートメントに進みます。しかし、$オプション変数にアクセスしているelseステートメントでは、「初期化されていない」エラーがスローされます。これは私が予想していたものとまったく逆です。どんな助けでも大歓迎です。Perlでの定義/ undefの使用

sub myFunction { 
    my ($length, $optional) = (@_); 
    if(undef($optional) 
    { 
    more code.. 
    } 
    else 
    { 
    more code... 
    } 
} 

myFunction(18) 
+4

を呼び出すときに、これが混乱になるだろう、パラメータをオフにシフトし、これは危険なコードです引数の数を取る:スカラー(@_)。 'foo(4、undef)'を呼び出すと、2つの引数を渡します。 –

+0

これは、未定義の値のテストが['undef']ではなく[' not defined'](http://perldoc.perl.org/functions/defined.html)であるためです(http://perldoc.perl.org /関数/undef.html)。 – hd1

答えて

21

正しい機能は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'; 

いずれかの方法で、私はしばしば、完全に別個の制御フローパスではなく、正常なデフォルトを持つことを好みます。これはしばしばコードを単純化するための良い方法です。

+1

'$ SCALAR = undef;'は定義を解除するだけです。 'undef(VAR)'は、スカラーの場合でも、もっと多くのことを行います。 (それは様々なメモリビットを解放します)。 – ikegami

+0

@ikegamiそれは正しいですが、なぜ複雑なものですか?私は 'perldoc -f undef'に書かれている振る舞いにこだわりました。多分、「ちょうど」という言葉が問題です。私はそれを削除します。 – DavidO

+0

「シフト」とは何ですか? –

0
my $optional = defined($_[0]) ? shift : 'Default value'; 

定義されている場合、それはあなただけは三番目のパラメータを持っていた場合は、どのように多くを見つけるためにしようとしている場合は、

MyFunc(10, undef, 20) 
関連する問題