作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在开发一个使用 unix 终端的消息系统,所以为了使消息输出更加用户友好,我想隐藏 <STDIN>
在按下 enter 按钮后输入以在另一个消息输出中使用它。
my $user = "Someone";
my $message = <STDIN>; #must show what does user type but should hide the message after pressing enter
chomp $message;
print messagefile "<$user> $message\n";
我在论坛上看到一些方法正在使用 Term::ReadKey
但不幸的是我无法做到这一点,因为该模块不存在于系统中。
最佳答案
借用 from answer .它一次读取一个字符,当按下回车键时,它用 \r <spaces> \r
删除当前行。
use strict;
use warnings;
sub get_pass {
local $| = 1;
my $ret = "";
while (1) {
my $got = getone();
last if $got eq "\n";
print $got;
$ret .= $got;
}
print "\r", " " x length($ret), "\r";
return $ret;
}
my $user = "Someone";
my $message = get_pass();
chomp $message;
print "<$user> $message\n";
BEGIN {
use POSIX qw(:termios_h);
my ($term, $oterm, $echo, $noecho, $fd_stdin);
$fd_stdin = fileno(STDIN);
$term = POSIX::Termios->new();
$term->getattr($fd_stdin);
$oterm = $term->getlflag();
$echo = ECHO | ECHOK | ICANON;
$noecho = $oterm & ~$echo;
sub cbreak {
$term->setlflag($noecho);
$term->setcc(VTIME, 1);
$term->setattr($fd_stdin, TCSANOW);
}
sub cooked {
$term->setlflag($oterm);
$term->setcc(VTIME, 0);
$term->setattr($fd_stdin, TCSANOW);
}
sub getone {
my $key = '';
cbreak();
sysread(STDIN, $key, 1);
cooked();
return $key;
}
}
END { cooked() }
关于linux - 按 Enter 后隐藏 STDIN 回显,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26258829/
我是一名优秀的程序员,十分优秀!