しばらく Perl から離れていて、ずっと前にアート プロジェクトとして書いたスクリプトを変更したいと考えています。元のスクリプトは Term::ReadKey を使用して、ユーザーが任意のテキストを Mac/Linux 端末に入力できるようにします。入力すると、テキストは端末にさまざまなフロート パターンを作成します。スクリプトを調整して、入力時にキーを読み取るのではなく、別のプロセスによって定期的に書き込まれたテキスト ファイルから読み取ることができるようにしたいと考えています。ただし、人間のタイピングを (大まかに) エミュレートするには、制御可能な方法で (一度にすべてではなく) 文字を読み取る必要があります。
私が試したこと: Term::ReadKey の man ページには、STDIN の代わりにファイルハンドルから読み取ることができると書かれていますが、何らかの理由で、標準ファイルまたは FIFO でこれを機能させることができませんでした。また、「open」を使用してファイルからテキストを読み込んで、文字を配列に入れてみました。しかし、スクリプトの残りの部分を一時停止せずに文字間に遅延を追加する必要があるため、配列の反復処理は複雑になりました。(これは潜在的な解決策として想像できますが、スクリプトが扱いにくくなることなく時間の遅延を制御できるようにするための最適な設計方法がわかりません。)
これにアプローチする比較的簡単な方法があるかどうか疑問に思っています-それが実現可能であると仮定しますか?
これが既存のスクリプトの「要点」です (さまざまなキー押下に基づいて追加の効果を追加するさまざまなサブルーチンが削除されています)。
#!/usr/bin/perl
use Time::HiRes(usleep);
use Term::ReadKey;
$|=1;
$starttime = time;
$startphrase = ' ';
$startsleepval = 3000;
$phrase = $startphrase;
$sleepval = $startsleepval;
$dosleep = 1;
$SIG{'INT'}=\&quitsub;
$SIG{'QUIT'}=\&quitsub;
# One Ctrl-C clears text and resets program. # Three Ctrl-C's to quit.
sub quitsub {print color 'reset' if ($dosleep); $phrase = $startphrase; $sleepval=$startsleepval; $SIG{'INT'}=\&secondhit;}
sub secondhit { $SIG{'INT'}=\&outtahere; }
sub outtahere {print color 'reset'; sleep 1; print "\n\n\t\t\t\n\n"; exit(0);}
while (1) {
print "$phrase ";
if ($dosleep) {
usleep ($sleepval);
}
ReadMode 3;
##### Here is where it reads from the terminal. Can characters be read from a file in a similar sequential fashion? #####
$key = ReadKey(-1);
$now = time;
if ((defined($key)) and ($now > $starttime + 5)) {
$phrase = $phrase.$key;
$SIG{'INT'}=\&quitsub;
}
# user can also create interesting effects with spacebar, tab and arrow keys.
ReadMode 0; # this may appear redundant, but has a subtle visual effect. At least that's what I commented in the original 2003 script.
}
# end main loop