Schrift
[thread]7956[/thread]

Problem mit Term::ReadKey

Leser: 1


<< >> 10 Einträge, 1 Seite
Gast Gast
 2006-05-09 11:42
#65789 #65789
Hallo!

Ich möchte den Input von einem Keypad mit Hilfe von Term::ReadKey auslesen. Der Prozeß soll 5 Sekunden auf eine Eingabe warten und - falls bis dahin keine Eingabe erfolgt ist - eine andere Aktion ausführen. Im Moment sieht der Code so aus:

Code: (dl )
1
2
3
4
5
use Term::ReadKey;

open (my $keypad, '</dev/keypad') or die "couldn't open device /dev/keypad: $!"
my $result = ReadLine 5, $keypad;
close $keypad;


Das Problem ist, dass er bei dieser Version ewig wartet. Wenn aber auf dem Keypad eine Taste gedrückt wird, liest er den Input korrekt ein.
Wenn ich auf diese Weise Input von STDIN lese, beendet er wie erwartet nach 5 Sekunden. In der Doku von Term::ReadKey habe ich keinen Hinweis darauf gefunden, dass sich die ReadLine Funktion beim Lesen von woanders als STDIN anders verhält.

Wo kann der Fehler liegen?
Matze
 2006-05-09 16:39
#65790 #65790
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Vielleicht musst du noch hinzubringen, dass $keypad dein STD-Handle
ist:
Code: (dl )
1
2
3
open...;
select $keypad;
...


MfG. Matze
Mit freundlichen Grüßen: Matze
skirnir
 2006-05-09 18:46
#65791 #65791
User since
2006-05-09
29 Artikel
BenutzerIn
[default_avatar]
Ich habe es jetzt mal so probiert:

Code: (dl )
1
2
3
4
5
open (my $keypad, '</dev/keypad') or die "couldn't open device /dev/keypad: $!"
my $old_in = select $keypad;
my $result = ReadLine 5;
select $old_in;
close $keypad;


Eigentlich hätte ich dasselbe Verhalten erwartet, stattdessen führt er jetzt den Timeout korrekt durch, nimmt aber keine Eingaben mehr vom Pad entgegen. Komische Sache das. Ich lese jetzt erst nochmal die doc von select...

EDIT: Es sieht so aus, als könne select nur den Output-Filehandle setzen, oder irre ich mich da?\n\n

<!--EDIT|skirnir|1147186343-->
Matze
 2006-05-09 21:05
#65792 #65792
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ja stimmt, select setzt das Output Filehandle.
Wenn du die Eingabe fertig hast musst du es natürlich wieder
zurück setzen:
Code: (dl )
select <STDOUT>;


MfG. Matze
Mit freundlichen Grüßen: Matze
skirnir
 2006-05-09 22:28
#65793 #65793
User since
2006-05-09
29 Artikel
BenutzerIn
[default_avatar]
Hab ich ja (select liefert das vorherige Handle als Rückgabewert, den ich in $old_in speichere und wieder zurücksetze), aber das Output-Handle nützt mir ja nichts, wenn ich Input vom keypad lesen will.
ptk
 2006-05-09 22:42
#65794 #65794
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Welches Betriebssystem, welche Perlversion? Unter FreeBSD und perl5.8.0 bzw perl5.8.8 tut es wie erwartet, jedenfalls mit /dev/stdin statt /dev/keypad.
pq
 2006-05-10 02:44
#65795 #65795
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Matze,09.05.2006, 19:05]
Code: (dl )
select <STDOUT>;
[/quote]
ohne die <>
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
skirnir
 2006-05-10 11:28
#65796 #65796
User since
2006-05-09
29 Artikel
BenutzerIn
[default_avatar]
[quote=ptk,09.May.2006, 20:42]Welches Betriebssystem, welche Perlversion? Unter FreeBSD und perl5.8.0 bzw perl5.8.8 tut es wie erwartet, jedenfalls mit /dev/stdin statt /dev/keypad.[/quote]
perl 5.8.7 unter GNU/Linux. Die STDIN Version funktioniert bei mir ja auch (übrigens auch in der von dir vorgeschlagenen /dev/stdin Variante). Das ist ja gerade das, was mir komisch vorkommt.

Mir ist schon klar, dass es den meisten mangels Keypad schwer fällt, den Fehler bei sich zu reproduzieren. Ich hatte gehofft, dass jemand vielleicht die Eigenarten von Term::ReadKey besser kennt als ich und vielleicht gleich einen Denkfehler meinerseits erkennt. Danke für eure Hilfe.
Matze
 2006-05-10 17:56
#65797 #65797
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=pq,10.05.2006, 00:44][quote=Matze,09.05.2006, 19:05]
Code: (dl )
select <STDOUT>;
[/quote]
ohne die <>[/quote]
Ja, ich benutze select() eigentlich nie...

MfG. Matze
Mit freundlichen Grüßen: Matze
ptk
 2006-05-11 10:31
#65798 #65798
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ich könnte mir vorstellen, dass /dev/keypad einige Terminal-Fiunktionalität, die Term::ReadKey benötigt, einfach nicht bereitstellt.
<< >> 10 Einträge, 1 Seite



View all threads created 2006-05-09 11:42.