2014-10-08 6 views
2

Я работаю над системой сообщений, которая использует терминал unix, поэтому для обеспечения вывода сообщений более удобным для пользователя я хотел скрыть <STDIN> вход после нажатия кнопки ввода, чтобы использовать его в другом сообщении.Скрытие 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, но, к сожалению, я не в состоянии сделать это, так как этот модуль не присутствует в системе.

+1

установить недостающий модуль с CPAN или cpanm Term :: ReadKey, если у вас есть APT-получить, вы можете попробовать выполнить apt get install libterm-readkey-perl –

+0

Я бы мог, если бы мог, у меня нет разрешения, и я не могу спросить администрацию. Я ищу другой способ: – user3544092

+3

[Вам не нужен root для установки модулей] (http://stackoverflow.com/questions/3735836/how-can-i-install-perl-modules-without-root-privileges) , – ThisSuitIsBlackNot

ответ

2

Заимствованные 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() } 
+0

Точно, что я хотел, Спасибо – user3544092

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 
+0

nope the sill сохраняет введенное сообщение на экране – user3544092

+0

Какой тип терминала вы используете? –

+0

это терминал bash – user3544092

Смежные вопросы