[PERL] Print flushed te laat

Pagina: 1
Acties:

  • Cyb
  • Registratie: Augustus 2002
  • Niet online
Ik zit met een probleem dat print te laat output geeft. Zie het volgende vb:
code:
1
2
3
4
#!perl
print "print1\n";
<stdin>;
print "print2\n";

De output van deze code, met als STDIN-input "input" vetgebruikt, is:
inputprint1
print2
Zoals je ziet, er wordt meteen om input gevraagd, en daarna wordt de print pas uitgevoerd (geflushed uit de STDIN buffer). Behoorlijk irritant.

Een oplossing blijkt het toevoegen van "$| = 1" te zijn, dus:
code:
1
2
3
4
5
#!perl
$| = 1;
print "print1\n";
<stdin>;
print "print2\n";

De output wordt dan:
print1

inputprint2
De print wordt nu dus wel meteen uitgevoerd, maar is nog niet correct. Ik krijg nu namelijk ongewenst een lege regel zonder dat ik daar om gevraagd heb. Heeft iemand hier een oplossing voor?

Het rare is dat $|=1; alleen nodig is bij verschillende Windows PERL IDE's. Als ik zonder $|=1; via perl.exe in dos-prompt (cmd) uitvoer, gaat het flushen wel meteen goed, en heb ik ook geen last van de lege regel. Maar, de Windows IDE's maken volgens mij ook gewoon gebruik van perl.exe, maar waarom lukt het dan bij de IDE's niet, en in DOS-prompt wel goed?

  • JaWi
  • Registratie: Maart 2003
  • Laatst online: 14-01 21:58

JaWi

maak het maar stuk hoor...

Zoals je zelf al aangaf wordt er vanuit de console wel de "juiste" output weergegeven. Ik neem even voor het gemak aan dat je gebruik maakt van ActiveState's Perl versie? Deze levert nl. ook een wperl.exe mee, welke niet direct een dos-box opent. Wat de IDE dan -waarschijnlijk- doet is de STDIN en STDOUT pipen naar/van een wperl.exe instantie, en dit levert niet altijd exact dezelfde resultaten als een normale dos-box.

Voor meer info kun je bijv. in de perlfaq5 manpage kijken...

edit:
Ik zie net pas dat je gebruik maakt van <stdin>, maar dit moet volgens mij sowieso <STDIN> zijn! En, 't is Perl, niet PERL... :9

[ Voor 15% gewijzigd door JaWi op 09-05-2005 21:40 ]

Statistics are like bikinis. What they reveal is suggestive, but what they hide is vital.


  • Cyb
  • Registratie: Augustus 2002
  • Niet online
JaWi schreef op maandag 09 mei 2005 @ 21:38:
Zoals je zelf al aangaf wordt er vanuit de console wel de "juiste" output weergegeven.
Ik blijf het raar vinden dat perl.exe via cmd.exe het wel pakt zonder $|=1, en perl.exe via een IDE het niet pakt. Het lijkt alsof via cmd.exe automatisch $|=1 wordt gebruikt, terwijl het precies dezelfde aanroep is als via een IDE.
Ik neem even voor het gemak aan dat je gebruik maakt van ActiveState's Perl versie? Deze levert nl. ook een wperl.exe mee, welke niet direct een dos-box opent. Wat de IDE dan -waarschijnlijk- doet is de STDIN en STDOUT pipen naar/van een wperl.exe instantie, en dit levert niet altijd exact dezelfde resultaten als een normale dos-box.

Voor meer info kun je bijv. in de perlfaq5 manpage kijken...

edit:
Ik zie net pas dat je gebruik maakt van <stdin>, maar dit moet volgens mij sowieso <STDIN> zijn! En, 't is Perl, niet PERL... :9
Ik ga voorlopig maar $|=1 gebruiken.

Hier trouwens iemand met hetzelfde probleem. http://groups.google.nl/g...=8&hl=nl#7525d6fb0c3e7e6d
Ook hier is de echte oorzaak onbekend.

  • KneoK
  • Registratie: December 2001
  • Laatst online: 00:47

KneoK

Not in a million lightyears

Uhm, kun je niet gewoon de stdin in een variabele gooien ?

code:
1
2
3
4
5
6
7
#!c:\perl\bin\perl.exe

print "test 1\n";
$inp = <STDIN>;
chop $inp;
print $inp, "\n";
print "test 2";


Hier komt bij mij keurig eerst test 1, op de volgende regel wat ik typ en op de regel daaronder test 2.

[ Voor 31% gewijzigd door KneoK op 10-05-2005 16:03 ]


  • Cyb
  • Registratie: Augustus 2002
  • Niet online
@BioWEB,
Welke IDE en Perl versie gebruik je?
(Zie perl.exe -v)

Ik gebruik ActiveState ActivePerl 5.8.6 build 811 en op dit moment geen IDE, maar gewoon via command prompt.

"BioWEB" slaat dat trouwens toevallig op Bioinformatica? :)