İ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";
Büyük notu, 'IO :: Select' sadece UNIX üzerinde çalışır Windows üzerinde çalışmıyor! – slm
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