按Enter后隐藏STDIN回显

时间:2014-10-08 14:01:19

标签: linux perl stdin

我在使用unix终端的消息系统上工作,所以为了使消息输出更加用户友好,我想在按下Enter按钮后隐藏<STDIN>输入,以便在另一个消息输出中使用它。

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,但遗憾的是我无法这样做,因为系统中没有该模块。

2 个答案:

答案 0 :(得分:2)

借来from answer。它会一次读取一个字符,当按下Enter键时,它会用\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() }

答案 1 :(得分:1)

来自http://www.perlmonks.org/?node_id=33353

use autodie qw(:all);

print "login: ";
my $login = <>;
print "Password: ";
system('stty', '-echo');  # Disable echoing
my $password = <>;
system('stty', 'echo');   # Turn it back on