Article View: pl.comp.lang.perl
Article #25if( kbhit() ) w perlu
From: Piotr Roszatycki
Date: Thu, 09 Jan 1997 19:32
Date: Thu, 09 Jan 1997 19:32
105 lines
2712 bytes
2712 bytes
Udalo mi sie :)
Po nieprzespanej nocy mam obsluge klawiatury bez zadnych funkcji ioctl,
fnctl, laczenia perla z C, XS, itd. Czysty perl!
Okazalo sie to strasznie banalne. Zreszta zapodaje sursa, moze sie komus
przyda?
#!/usr/bin/perl
#
# getkey.pl
# (c) 1997 Dexter!dexter@dedal.man.szczecin.pl
#
# wymaga programu "stty"
# &init_getkey
# Przelacza terminal w odpowiedni tryb
#
sub init_getkey {
$oldstty = `stty -g` || "sane"; # zapamietuje poprzedni stan
terminala
# lub "sane" - standardowe
ustawienia
system "stty raw -echo"; # wczytuje od teraz bez echa i
znakow kontrolnych
}
# &done_getkey
# Przywraca poprzedni stan terminala
#
sub done_getkey {
system "stty $oldstty";
}
# &kbhit( strumien )
# Powrot:
# 0 - brak wcisnietych klawiszy, 1 - wcisnieto klawisz
#
sub kbhit {
local($fd) = shift || fileno(STDIN);
local($rin) = '';
vec( $rin, $fd, 1 ) = 1;
local($nfound) = select( $rin, undef, undef, 0 );
$nfound;
}
# &getch( strumien )
# Powrot:
# kod klawisza
#
sub getch {
local($fd) = shift || fileno(STDIN);
local($key);
sysread(STDIN,$key,1);
$key;
}
1;
---------koniec---------
I oto jak to mozna wykorzystac:
#!/usr/bin/perl
require 'getkey.pl';
$| = 1; # musi byc autoflush, by nie buforowal print'y
&init_getkey;
$i = 0;
do {
if( ++$i >= 100 ) {
$i = 0;
print ".";
}
if( &kbhit ) {
$key = &getch;
print "\r\n$key\r\n"; # bo teraz nie tlumaczy \n na \r\n !
}
} until( $key eq 'q' );
&done_getkey;
---------koniec---------
No wlasnie, wykorzystuje "stty", i tylko zastanawiam sie, czy jest to na
tyle standardowe narzedzie, ze odpali sie na kazdym systemie...
Sprawdzilem, chodzi na Linux'ie i IRIX'ie. Jesli ktos ma dostep do
innych systemow, prosze o kontakt przez mail'a, jesli cos jest nie tak.
Teraz mozna pokusic sie o "conio.pl" ;)
--
Piotr "Dexter" Roszatycki
http://www.szczecin.pl/~dexter
mailto:dexter@dedal.man.szczecin.pl
irc:Dexter#SzczeciN
Technical Details
Message-ID:
<32D547D7.5A84@dedal.man.szczecin.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!uw.edu.pl!news.nask.pl!usenetShow Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!uw.edu.pl!news.nask.pl!usenet From: Piotr Roszatycki <dexter@dedal.man.szczecin.pl> Newsgroups: pl.comp.lang.perl Subject: if( kbhit() ) w perlu Date: Thu, 09 Jan 1997 20:32:39 +0100 Organization: Public NewsServer at NASK N.O.C. Lines: 106 Message-ID: <32D547D7.5A84@dedal.man.szczecin.pl> NNTP-Posting-Host: ppp-srd52.szczecin.tpnet.pl Mime-Version: 1.0 X-Mailer: Mozilla 3.0Gold (Win95; I) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit