Perl Term :: ReadKey - 从文件中读取,就好像它正在输入一样

时间:2016-01-04 02:09:50

标签: perl ascii-art console.readkey readkey

离开Perl一段时间了,想要修改我很久以前作为艺术项目编写的脚本。原始脚本使用Term :: ReadKey允许用户在Mac / Linux终端中键入任意文本。在键入时,文本会在终端中创建各种浮动模式。 我想调整脚本,因为它不是在输入时读取键,而是可以从另一个进程定期写入的文本文件中读取。但它需要以某种可控的方式读取字符(不是一次全部)以便(大致)模仿人类输入。

我尝试了什么: Term :: ReadKey的手册页说它可以从文件句柄而不是STDIN读取 - 但由于某种原因,我无法使用标准文件或FIFO来实现。我还尝试使用“打开”从文件中读取文本并将字符放入数组中。但是迭代遍历数组变得复杂,因为需要在字符之间添加延迟而不会暂停其余的脚本。 (我可以设想这是一个潜在的解决方案,但我不确定如何设计它以使时间延迟可以控制而不会使脚本变得笨拙。)

想知道是否有一种相对简单的方法来解决这个问题 - 假设它完全可行?

这是现有脚本的“肉”(删除了各种基于各种按键添加其他效果的子程序。)

#!/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

1 个答案:

答案 0 :(得分:1)

这里的问题是你的脚本可以尝试从文件中读取你想要的所有内容,但是如果实际写入文件的进程一次性刷新,那么你将把所有内容放在一起。

还有一些事情:

  • 如果您真的想使用ReadKey,如果您不知道文件的CR或CR / LF使用情况,则应该使用ReadMode 5

  • 同时检查Term::ReadKey,您会发现您可能需要ReadKey 0, $file

  • 之类的内容
  • 最好完全删除Term :: ReadKey并使用File::Tail代替,一次循环添加一个字符

  • 您的最终代码最有可能是一系列字符,就像您已经尝试过的那样。