2011-02-04 14 views
2

が私のコードです:Perlが動作しない場合は?ここで

#!/usr/bin/env perl 

sub start 
{ 
    ... 
} 

sub stop 
{ 
    ... 
} 

if (defined $ARGV[0]) 
{ 
    if ($ARGV[0]=='start') {start} 
    elsif ($ARGV[0]=='stop') {stop} 
    else {die "Unrecognized command: $ARGV[0]"} 
}

私もやる何であれ、それは常に&startを実行します。私は何か間違っているのですか?

私はLinux Mint 10とPerl 5.10.1を使用しています。

答えて

14

数値比較を使用して文字列の等価性をチェックしています。これは、引数を数値に変換してから比較することです。

この場合、 'start'は数字ではないため、0に変換されます。 $ARGV[0]の値(ここでは単語になると予想されます)も変換され、0となり、最終条件はif (0 == 0)になります。これは常にtrueです。

あなたが代わりにeq文字列単位の比較演算子を使用したい:

if ($ARGV[0] eq 'start') { start } 

は異なる比較演算子の詳細については、docsを参照してください。

スクリプトの先頭にuse warnings;を含めて(コメント内で指摘されているように)、perlはこれを最初から警告することになります。この種のエラーを早期に捕捉するのに役立つので、常にuse warnings;use strict;を含むことが一般的にベストプラクティスです。

+9

数字として扱われる 'start'は0と同じで、他のほとんどの文字列も同様です。 '警告を使う。厳密な;を使用すると助けになります。 –

+2

実際、厳密な警告と警告がオンになっていると、問題はすぐに関連する警告メッセージで飛び出します。 – Ether

+0

彼の最初の条件は実際には 'if(0 == 0)'であり、これはかなり自明です。 – Axeman

2

あなたのプログラムは、Perlコードに対してthe standard boilerplateで始まるのを怠っています。

+0

バグは最初にPerlを使用しています。私はいつもPerlは書き込み専用言語だと考えました。質問は私にそうでなければ教える... – Ber

関連する問題