0
#!/usr/bin/env perl

use Term::ReadKey;
ReadMode 4;
END {
    ReadMode 0; # Reset tty mode before exiting
}

while (<>) {
    $key = ReadKey(0);
    $key == "\x04" and last; # Ctrl+D breaks the loop 
    print $key;
}

当我没有while循环时,它正在打印我输入的内容。

它甚至不会在最后产生任何输出(如果它正在缓冲它或其他东西)。就像我运行它并键入几个字母并按 Ctrl+D 一样。它什么也不打印。

我正在尝试制作一个程序来将鼠标滚动转义码转换为 keypresses。我希望我没有叫错树。

4

2 回答 2

3

这条线

while (<>) 

从中读取一行STDIN(假设您在没有命令行参数的情况下运行程序)。一旦读取了一行,它就会进入 while 循环的主体。您输入的任何内容(包括换行符)现在都在$_.

现在,您按下一个键,它存储$keyCTRL-D. 由于两者都不是数字,它们最终都为零,循环终止。

这就是为什么您应该打开会告诉您的警告:

参数“^D”在 ./tt.pl 第 15 行第 1 行的数字 eq (==) 中不是数字。
参数“c”在 ./tt.pl 第 15 行第 1 行的数字 eq (==) 中不是数字。

当然,将循环终止条件也放在它所属的位置是有意义的:

#!/usr/bin/env perl

use strict;
use warnings;

use Term::ReadKey;
ReadMode 4;
END {
    ReadMode 0; # Reset tty mode before exiting
}

my $input;
{
    local $| = 1;
    while ((my $key = ReadKey(0)) ne "\x04") {
        print $key;
        $input .= $key;
    }
}

print "'$input'\n";
于 2013-04-14T12:24:46.303 回答
3

只需将 while 条件替换为:

while(1) {
   # ...
}
于 2013-04-14T10:03:39.617 回答