2011-12-27 13 views
-4

OK:Perlがこのメッセージを印刷して終了しないのはなぜですか?

my $login='anybody'; 
exit if $login ne 'root'; 

ないでOK:なぜ以下の印刷されない "error"?

my $login='anybody'; 
(print "error" && exit) if $login ne 'root'; 

(条件){行動}について知っています。私はちょうど現在の問題について知りたい。

+4

"NOT OK"とはどういう意味ですか?予期せぬことが起こりますか?それは警告/エラーを投げますか? – bobbymcr

+0

実際、ブライアン、Perlでそれがあります。例えば、 'open(stuff)|| bashスクリプティングのように、あらゆる種類のエラーチェックのために "die" error "を返します。 – Dan

+0

@ダン - 私はコメントするために削除し、完全に説明するために答えに移動しました。物事が実行されるかどうかを制御する*論理的な比較ですが、まだOPのコードへの書き方が書かれている "それからやってください"ではありません。 –

答えて

10

何を書かれていることは言うので:

は、「文字列 『エラー』とコマンド出口の結果の評価を印刷する」

あなたが実際に書くことができます:

((print "error\n") && exit) if $login ne 'root'; 

ただし、しないでください。 :)

+3

+1は「しないでください」 –

+0

私は実際にはそれが舌と頬であると思って削除しました。私は戻ってロールバックした: –

+0

あなたは "舌IN頬"を意味します。 – AmbroseChapel

7

"エラー"が表示されていないと思われますが、正しいですか?これは、式print "error" && exitprint ("error" && exit)と解釈されるためです。代わりにこれを試してみてください:

do { print "error"; exit } if $login ne 'root'; 
+0

良い推測ですが、推測するべきではありません。問題はより明確に述べるべきです。 IMHO ... – paulsm4

+0

しかし、 'perldoc perlop'は、単項演算子の名前が' && 'より優先度が高いので、'(print "error")&& exit'と解釈する必要があります。 – Dan

+2

@Dan - 'print'は名前付きの単項演算子ではありません。それは関数です。 –

9

3つの問題があります。


最初に問題となるのは、優先事項の1つです。

print "error" && exit if ...; 

print("error" && exit) if ...; 

可能な修正と同じです:

(print "error") && exit if ...; 
print("error") && exit if ...; 
print "error" and exit if ...; 

第二の問題は、exitprintの結果を条件であるということです、それは適切ではありません。 printがエラーを返しても終了します。

可能な修正:

(print "error"), exit if ...; 
print("error"), exit if ...; 

第三の問題は、これがエラーを報告する本当に貧弱な方法であるということです。エラーはSTDERRに出力され、ゼロ以外の終了コードを使用する必要があります。 dieはここでうまくいくでしょう。

die "error" if ...; 
+1

+1は第2の問題を強調するために、ルートからの問題を解決します。 – Zaid

+0

Zaidは今や第3の問題を参照していました。 – ikegami

関連する問題