sziasztok!
fura jelenség került elém perl "tanulgatásom" közben, hátha szakavatottak tudnának segíteni a megértésében. (előre bocsátom, hogy elég alap dolgokat ismerek a perl scriptekről, lehet ebből adódik valami elvi hibám). roppant egyszerű scriptet akartam gyártani, amolyan "hogy is kell" címen. egy szál ciklus volt benne (for), abban történt egy kiértékelés a ciklusváltozóra nézve, majd a ciklus végén némi output. mivel lassú volt, ezért a folyamatot is meg akartam figyelni és a ciklusmagba beraktam pár print-et, hogy lássam hol tart épp.
legnagyobb meglepetésemre a printek a ciklus után "egyszerre" jelentek meg. ilyet még nem láttam, ezért próbáltam debugolni, majd másnak is megmutatni (az illető jóval többet programozott, gondoltam hátha lesz ötlete). nem értettük. ezután a sok kísérlet után kerültek bele a printek mellé felhasználói inputok is (STDIN olvasás). innentől a program jól működött. kigyomláltuk az összes "szemetet" (vissza az eredeti kb. 5 soros programhoz!) és továbbra is jól működött a program!
mi lehet az oka annak, hogy a program csak a végén írt ki mindent?? tény, hogy nem vagyok programozó, de egy sima for ciklus, benne if és print nem kéne, hogy ennyire ismeretlen rejtélyt produkáljon :) (gondoltam én...)
a környezet egy win-es gép, perl 5.10valami. a kód kb az alábbi "bonyolultságú volt":
use Net::Ping;
$p = Net::Ping->new("icmp");
$elnek="";
for ($ip = 2; $ip<101; $ip++) {
$host="10.0.0." . $ip;
if ( $p->ping($host, 1)) {
$elnek .= " $ip";
print "Aktiv: $ip\n";
}
}
print $elnek;
Hozzászólások
$| = 1;
autoflush amit szeretnel
kicsit kifejtenéd? lehet félreértem.
--
xterm
Bufferelve ir ki a terminalra a perl, igy ha nincs az autoflush bekapcsolva (amit a kollega emlit elottem), akkor a karakterek csak akkor kerulnek ki a kepernyore, ha kuldesz ki egy sortorest is. Ha tettel volna a print-be egy "\n" -t, akkor realtime megjelentek volna a sorok. Masik megoldas az autoflush bekapcsolasa.
google perl+autoflush vagy perldoc perlvar es abban $OUTPUT_AUTOFLUSH vagy $| , ha erdekel
ha nem akkor tedd eleg a $| = 1; a scriptbe, lehetoleg a print ele ;)
> mi lehet az oka annak, hogy a program csak a végén írt ki mindent?
A perl minimalizálni próbálja a szükséges írási műveletek számát. Kikapcsolható: http://perldoc.perl.org/perlvar.html#$OUTPUT_AUTOFLUSH
egy perldoc perlstyle sem fog megartani es perltidy is hasznos
kösz a tippet, megnéztem és valóban hasznosak. úgy látszik a meglepetésem miatt pont triviális keresések sem jutottak az eszembe (inkább tűnt "bugnak" a perl-lel szembeni tapasztalatlanságom miatt)
--
xterm
hm... az ember mindig tanul valami érdekeset :) a legtöbb esetben írok az ilyen kiiratások után sortörést, viszont pont a kérdéses példa debugolásakor nem tettem. köszönöm szépen a segítséget!
--
xterm