2010-11-21 3 views
2

条件付きでファイルが存在するかどうかテストするのに落とし穴がありますか?

私は最近、特定のファイルが生きるまで待つという興味深いコード行に出くわしました:

sleep 1 until -e $file; 

行の値で行が期待している間は、何かがあると感じるのを助けることはできません。ここにはない。

while (1) { 

    sleep 1; 
    last if -e $file; 
} 

ファイルテスト演算子は、ifunlessでのみ使用されますか?そして、while条件内にそのような演算子を配備する際に、パフォーマンス上の罰則はありますか?

+1

パフォーマンス?ここでの唯一のペナルティは、ファイルシステムにpingを実行することです。これは、どのループよりも大きなペナルティのオーダです。 – Drakosha

+0

@Drakosha:典型的なファイルpingがどれくらいの時間かかると思いますか?遅れに対処するには1秒間の睡眠で十分ではありませんか? – Zaid

+0

はい、通常のファイルシステム/ストレージに十分な時間がかかるようです。ループ性能をチェックしている理由は分かりませんでしたが、ここではごくわずかです。 – Drakosha

答えて

3

一方、偽(until)ループ対、又はif/unlessでテストを分離しながら、真(while)のファイルテスト演算子を使用しての間に違いはありません、またとの違いがありますPerlの何か。

whileループの魔法の唯一のケースは、... while <$handle>;またはwhile (<$handle>) {...}であり、定義中に$_を次の行に設定します。また、間違った(until)ループを素手で使用することは実際には意味がありません。

a until bの構成は、単にa while not bです。次を使用し、whileループにsleep 1 until -e $file;を変換するには

sleep 1 while not -e $file; 

これは、ブロックの形に拡張することができます。

while (not -e $file) {sleep 1} 

または内部エスケープと無限whileとして:

while (1) { 
    last if -e $file; 
    sleep 1; 
} 

これらの形式はすべて同等です。

残りの質問に答えると、ほとんどのファイルシステムはチェック間で1秒のスリープで正常に動作するはずですが、プロセスが緊急にファイルを待っていない場合は、多くの方法で多くの方法を選択できます。また、ファイルシステムが遅いデバイス(フラッシュメモリや低速ネットワーク経由で保存されているデバイス)を使用している場合は、大きな値を試してみることもできます。

そして、彼らは返す構造体の最後の要素ある場合は、以下のysth nitpicksとして、一般的には、ステートメントの形式が異なり、ブロックフォームより戻る:do {...}を、sub {...}do FILE、evalを...

+0

@Eric: 'if'条件文とは対照的に' while'条件文の中でのファイルテストの比較にもっと興味がありました。 'until' /' while not'等価はここでは問題になりません。 – Zaid

+0

@ Zaid =>これは同じ問題です。ファイルテストは、ブール値のコンテキスト内の他の操作と同様に、ループ内の条件付き条件( 'if')と条件付きループ(' while')との間のマジック動作を持ちません。 –

+0

@あなたの "より自然なように見える"から、あなたが気にするような、untilステートメント修飾子を使用しているように思えます。 – ysth

2

ファイルが存在していても、あなたのより自然な方法は、起動時に眠っているようです。

while(not -e $file) { sleep 1; } 

sleep 1 until -e $file;の正確同義語が、私の意見でより理解している、私には良さそうです。

+0

正確な同義語ではありません。 1つは偽、1つは真を返すでしょう。 – ysth

関連する問題