2008-08-18 25 views
11

İlk Perl uygulamasına yazıyorum - bir Arduino mikroişlemcisiyle görüşen bir AOL Instant Messenger botu, sırayla her 28 saatte bir rasgele dolan sysadmin sunucusundaki güç düğmesine basacak bir servoyu kontrol ediyor.Perl'de engellemeden STDIN'i nasıl test edebilirim?

Yapılan tüm zor şeyleri aldım, ana döngüyü kesmek ve kullanıcı 'çık' yazarken AIM'den çıkmak için sadece son bir kod eklemek istiyorum.

Sorun, ana program döngüsünde STDIN'den okumaya çalışırsa, giriş girilene kadar işlemi engeller, temel olarak bot etkin değildir. Okumadan önce EOF testi denedim, ama zar yok ... EOF sadece her zaman yanlış geri döner.

İşte aşağıda var ben çalışıyorum örnek kod:

while(1) { 
    $oscar->do_one_loop(); 

# Poll to see if any arduino data is coming in over serial port 
    my $char = $port->lookfor(); 

# If we get data from arduino, then print it 
    if ($char) { 
     print "" . $char ; 
    } 

    # reading STDIN blocks until input is received... AAARG! 
    my $a = <STDIN>; 
    print $a; 
    if($a eq "exit" || $a eq "quit" || $a eq 'c' || $a eq 'q') {last;} 
} 

print "Signing off... "; 

$oscar->signoff(); 
print "Done\n"; 
print "Closing serial port... "; 
$port->close() || warn "close failed"; 
print "Done\n"; 

cevap

17
Perl dahili select() sistem çağrısına bir geçiş olduğunu, ancak aklı başında insanlar için ben IO::Select tavsiye select() olduğu

.

kod örneği: kimseye

#!/usr/bin/perl 

use IO::Select; 

$s = IO::Select->new(); 
$s->add(\*STDIN); 

while (++$i) { 
    print "Hiya $i!\n"; 
    sleep(5); 
    if ($s->can_read(.5)) { 
    chomp($foo = <STDIN>); 
    print "Got '$foo' from STDIN\n"; 
    } 
} 
+4

Büyük notu, 'IO :: Select' sadece UNIX üzerinde çalışır Windows üzerinde çalışmıyor! – slm

+0

Aslında Windows'da 'IO :: Select' ve' select() ', (bazı) internet-domain soketleri için çalışır, ancak sadece bu. Windows şaşırtıcı derecede bozuk bir platformdur. Bu nedenle, bu gibi basit bir platformlar arası API'nın tüm vakalarda çalışmasını beklemeyin. Soketler için bir şey yapmalısınız, başka bir dosya için/adlandırılmış borular için, anonim borular/"Konsol" tutamaçları için başka bir şey ... "Onların" (WPAPoll) anketini çağırmaları gerçeği sadece işe yaradı internet soketleri ve içinde bilinen hataları düzeltmeyi reddettik çünkü "anket() kullanımdan kaldırılmış" ** uzak kalmak için ** bir uyarı olmalı. – alexchandel

İlgili konular