【发布时间】:2018-10-27 02:33:58
【问题描述】:
我正在尝试读取STDIN,然后获取用户输入行而不在终端中显示它。
Term::ReadKey 的ReadMode('noecho') 解决方案将不起作用,因为它使用<STDIN>,如果它不是空的,它会立即将(应该是文件,例如管道数据)作为 输入 并且实际上不起作用:
use warnings;
use strict;
use Term::ReadKey;
my $_stdin = <STDIN>;
print "Enter your password:\n";
ReadMode('noecho');
my $_pass = ReadLine(0); # This one uses <STDIN>!
ReadMode(0);
print "STDIN:\n$_stdin\nPassword:\n$_pass\n";
输出:
$ echo "some data" | perl term-readkey.pl
Enter your password:
Use of uninitialized value $_pass in concatenation (.) or string at term-readkey.pl line 10, <STDIN> line 1.
STDIN:
some data
Password:
我提供的唯一解决方案是使用Term::ReadLine,这似乎没有使用<STDIN> 作为Term::ReadKey,但问题是$_term->readline() 的输出是可见的:
use warnings;
use strict;
use Term::ReadLine;
my $_stdin = <STDIN>;
my $_term = Term::ReadLine->new('term');
my $_pass = $_term->readline("Enter your password:\n");
print "STDIN:\n$_stdin\nPassword:\n$_pass\n";
输出:
$ echo "some data" | perl term-readkey.pl
Enter your password:
25 # actually entered it, and its visible...
STDIN:
some data
Password:
25
有一个similar question,但答案只适用于 Unix'y 系统并且输入可见...
【问题讨论】:
-
请注意,ReadLine() 被记录为不能在 Windows 上工作(但您可以改为使用
<STDIN>)。您是否希望在特定的非 Unixy 架构上运行它? -
您可以尝试将
Term::ReadLinefindConsolemetacpan.org/pod/Term::ReadLine#findConsole返回的设备名称与Unix'y系统的解决方案结合起来 -
@Ujin 谢谢,成功了。
-
@Ujin 但是又是可见...
-
啊找到了,用
ReadMode('noecho', TTY)...