2010-01-16 6 views
6

J'exécute le script Perl sous cygwin qui prend l'entrée de <STDIN> et traite les requêtes en continu.Comment puis-je gérer les touches fléchées dans un script Perl sous cygwin?

#!/usr/bin/perl 
print "Enter Input:"; 
while(<STDIN>) { 
    print "Recieved Input: $_"; 
    print "Enter Input:"; 
} 



    $perl testPerl.pl   
    Enter input:input1 
    Recieved input:input1 
    Enter input:inpt2 
    Recieved input:input2 
    Enter input: 

Maintenant, je voudrais la flèche à l'invite actuelle: « Entrez entrée: » prendre les entrées précédentes ie « input2 », « input1 »

Il se comporte comme prévu lors de l'exécution sous fenêtres enivronment (cmd.exe)
Mais le problème sous Cygwin est que la flèche prend littéralement le curseur 1 ligne vers le haut-à-dire qu'il faut à la ligne « entrée a reçu: input2 »

S'il vous plaît partager vos réflexions sur ce sujet.

+1

S'il vous plaît partager le code que vous utilisez pour traiter les séquences de touches. En outre, vous pouvez reformuler votre message afin qu'il contienne une question claire. – Ether

+0

Merci Ether pour le commentaire. J'ai joint l'extrait de code et reformulé la question pour être plus clair. Je n'utilise pas de routines spéciales pour traiter les séquences de touches, il suffit de capturer l'entrée standard . S'il vous plaît laissez-moi savoir si des informations sont nécessaires plus loin. –

+0

C'est un problème de configuration du terminal, je pense. J'ai toujours détesté les terminaux fournis par cygwin. –

Répondre

4

Regardez le module Term :: Readline. Cela prendra en charge les entrées pour votre programme, et gère l'histoire, ce dont je pense que vous parlez.

Ce serait une traduction directe de votre programme à l'aide Term :: ReadLine:

 
use Term::ReadLine; 
my $term = new Term::ReadLine 'Simple Perl calc'; 
my $prompt = "Enter Input: "; 
while (defined ($_ = $term->readline($prompt))) { 
    print "Recieved Input:$_\n"; 
    $term->addhistory($_) if /\S/; 
} 

1

Il y a une grande différence dans la gestion de l'historique de la ligne de commande entre la console Windows et les terminaux Unix. Sur Windows, c'est fait par la console, alors que sous Unix, les applications en sont responsables. Je ne sais rien à propos de Perl, mais vous devrez utiliser quelque chose comme la bibliothèque readline. Cela semble utile: http://perldoc.perl.org/functions/readline.html

+0

La bibliothèque readline et la fonction Perl du même nom sont des bêtes différentes. –