私は誰かが助けてくれることを望んでいる問題を抱えています...
文字列のディレクトリ内のフォルダーを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;
私が見落としている簡単な解決策があるかもしれませんが、これまでこれを行う必要がなかったので、あなたの助けに感謝します。