Perl Term::ReadKey-从文件中读取,就像它';正在打字
我离开Perl有一段时间了,想修改我很久以前作为艺术项目编写的脚本。原始脚本使用Term::ReadKey允许用户在Mac/Linux终端中键入任意文本。键入时,文本会在终端中创建各种浮动模式我想调整脚本,这样它就可以从另一个进程定期编写的文本文件中读取,而不是在输入时读取键。但它需要以某种可控的方式(不是一次全部)读入字符,以便(大致)模仿人类打字。 我所尝试的: ReadKey的手册页上说,它可以从文件句柄而不是STDIN读取数据,但由于某种原因,我无法使用标准文件或FIFO来实现这一点。我还尝试使用“打开”从文件中读取文本,并将字符放入数组中。但是遍历数组变得很复杂,因为需要在字符之间添加延迟,而不暂停脚本的其余部分。(我可以设想这是一个潜在的解决方案,但我不确定如何最好地设计它,使时间延迟可控,而不会使脚本变得笨拙。) 想知道是否有一种相对简单的方法来实现这一点——假设它是可行的? 以下是现有脚本的“肉”(删除了各种子程序,这些子程序根据各种按键添加了附加效果。)Perl Term::ReadKey-从文件中读取,就像它';正在打字,perl,ascii-art,console.readkey,readkey,Perl,Ascii Art,Console.readkey,Readkey,我离开Perl有一段时间了,想修改我很久以前作为艺术项目编写的脚本。原始脚本使用Term::ReadKey允许用户在Mac/Linux终端中键入任意文本。键入时,文本会在终端中创建各种浮动模式我想调整脚本,这样它就可以从另一个进程定期编写的文本文件中读取,而不是在输入时读取键。但它需要以某种可控的方式(不是一次全部)读入字符,以便(大致)模仿人类打字。 我所尝试的: ReadKey的手册页上说,它可以从文件句柄而不是STDIN读取数据,但由于某种原因,我无法使用标准文件或FIFO来实现这一点。我
这里的问题是,您的脚本可以尝试从文件中读取所有您想要的内容,但是如果实际写入文件的进程一次刷新所有内容,那么您将把所有内容都收集起来 还有几件事:
- 如果您确实想使用ReadKey,如果您不知道文件的CR或CR/LF用法,则可能应该使用
ReadMode 5
- 同时检查一下,您会发现您可能需要类似于
ReadKey 0,$file
- 最好完全删除Term::ReadKey并使用,每次循环添加一个字符
- 您的最终代码很可能是经过字符数组的代码,就像您已经尝试过的那样
#!/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