4

私は誰かが助けてくれることを望んでいる問題を抱えています...

文字列のディレクトリ内のフォルダーをgrepするなど、反復ごとにバックティックコマンドを実行するforeachループがあります(以下に示すように、質問を説明するために大幅に簡略化されています)。

my @folderList = ("/home/bigfolder", "/home/hugefolder", "/home/massivefolder");
my @wordList = ("hello", "goodbye", "dog", "cat");

foreach my $folder (@folderList) {
     foreach my $word (@wordList) {
          print "Searching for this $word in this $folder\n";
          my @output = `grep -R $word $folder`;    #this could take hours so the user needs the option to skip/cancel this iteration and go the next one 
          print "@output\n";
     }
}

私が抱えている問題:

backticks grep コマンドが実行されているフォルダーが特に大きい場合、またはチェック対象の単語の配列が特に大きい場合、backticks コマンドが完了するまでに数時間かかることがあります (これは問題ありません)。

しかし、私ができるようにしたいのは、ユーザーがキーを押したときに長い時間がかかっている場合は、内側のループから抜け出し (つまり、フォルダー内の単語が検索されている場合)、次の反復に進むことです。キーボードを押すか、「次へ」または「終了」などの単語を入力します。

バックティックを使用していなかった場合、次のようなものを使用して通常のループから簡単に抜け出すことができることを知っています (ただし、バックティック/システム コールが関係している場合、このロジックは明らかに機能しません)。

use strict;
use warnings;

use Term::ReadKey;

my $n = 0;

while () {
    print '.';
    last if ReadKey(-1);
    $n++;
}

print $n;

私が見落としている簡単な解決策があるかもしれませんが、これまでこれを行う必要がなかったので、あなたの助けに感謝します。

4

3 に答える 3

2

解決策は、長時間実行されるプログラムをバックグラウンド プロセスで実行し (そして新しいプロセスのプロセス ID を記憶し)、ユーザーの操作をフォアグラウンド プロセスに維持することです。フォアグラウンドが中断するように通知されたら、バックグラウンド プロセスを強制終了します。

私が言及したすべての部分は、Stack Overflow の以前の投稿で十分に説明されています。

于 2013-07-29T16:57:24.813 に答える