2

最近、特定のファイルが起動するまで待機する興味深いコード行に出くわしました。

sleep 1 until -e $file;

額面通り、この線は期待どおりの動作をしますが、ここに何かが正しくないことを感じずにはいられません。次のように書く方が自然なようです。

while (1) {

    sleep 1;
    last if -e $file;
}

ifファイルテスト演算子は、およびでのみ使用することを目的としていunlessますか?whileそして、そのような演算子を条件文内にデプロイすることでパフォーマンスのペナルティはありますか?

4

2 に答える 2

3

whilewhile-true()ループとwhile-false( )ループでファイルテスト演算子を使用すること、またはテストを/でuntil区切ることによって違いはありません。また、Perlの他のものとの違いもありません。ifunless

whileループの唯一の魔法のケースは、... while <$handle>;またはが定義されている間に次の行にwhile (<$handle>) {...}設定されます。そして、裸のハンドルで$_while-false()ループを使用することは実際には意味がありません。until

構成はa until b単純a while not bです。

ループに変換するsleep 1 until -e $file;にはwhile、次を使用します。

sleep 1 while not -e $file;

次に、これをブロック形式に展開できます。

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

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

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

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

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

そして、ysth以下の落とし穴として、一般に、ステートメントフォームは、ブロックフォームが次を返す構造の最後の要素である場合、ブロックフォームとは異なる方法で返されます:、、、eval do {...}.. ..sub {...}do FILE

于 2010-11-21T18:48:00.920 に答える
2

ファイルが存在する場合でも、より自然な方法は開始時にスリープしているように見えます。

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

私にはそれがより良いように思えます。これは正確に同義語ですsleep 1 until -e $file;が、私の意見ではより理解しやすいものです。

于 2010-11-21T18:39:22.470 に答える