Ho uno script Perl che elabora una pipe. A un certo punto, mi piacerebbe che lo script si fermasse e chiedesse l'input da tastiera dell'utente. my $input = <STDIN>;
non funziona. Legge solo la riga successiva dal tubo. Come posso far sì che Perl usi maniglie diverse per l'immissione di pipe e l'input da tastiera?Come far sì che Perl usi maniglie diverse per l'input della pipe e l'input da tastiera?
6
A
risposta
12
Se si è su una piattaforma Unix, è possibile aprire un filehandle su /dev/tty
(oppure utilizzare IO::Pty
).
Un buon esempio di lavoro con tty è in "Test se un programma è in esecuzione in modo interattivo" esempio qui: http://pleac.sourceforge.net/pleac_perl/userinterfaces.html
Si dovrebbe anche prendere in considerazione facendo la password IO tramite Term::ReadKey
(descritti in perlfaq8) - Penso che possa essere legato alla TTY invece di STDIO ma non sono sicuro. In caso contrario, utilizzare la soluzione TTY + Term :: ReadKey elencata alla fine di this SO answer by brian d foy.
Ecco un esempio.
It's not the best style (doesn't use 3-arg form of open
, nor uses lexical filehandles) ma dovrebbe funzionare.
use autodie; # Yay! No "or die '' "
use Term::ReadKey;
open(TTYOUT, ">/dev/tty");
print TTYOUT "Password?: ";
close(TTYOUT);
open(TTY, "</dev/tty");
ReadMode('noecho');
$password = ReadLine(0, *TTY);
Problema risolto. Molte grazie. – Arkady
@Arkady - siete i benvenuti. Sentitevi liberi di accettare la risposta facendo clic sul segno di spunta accanto ad essa (che vi farà guadagnare anche 2 punti di rep) e di votare la risposta (freccia su accanto ad essa) – DVK