On Apr 21, 2011, at 10:47 AM, Dr. Martin P.J. Zinser wrote:

> Hello Craig,
> 
> nobody used the dirty Oracle word around here, just because something is a 
> table
> it does not have do come from a database ;-)

Sorry.  I promise to wash my mouth out with soap :-).

> Anyhow, I made some progress and have an easy reproducer plus example output 
> and
> config information all wrapped up at 
> http://zinser.no-ip.info/www/trans/lineb.zip
> 
> No other modules but CGI are involved in the example. The version I use is 
> 3.49.
> For best effect look at the output files in a terminal set to 132. 
> 
> The terminal output was created with perl lineb.pl >terminal.txt
> 
> The web output was captured with 
> "View Source" from a Web browser.
> 
> The Webserver in question is an OSU 3.11 server, communication betweeen the 
> server
> and perl is via a local DECnet task.
> 

Yikes.  I've never used OSU and I haven't touched a DECnet object in about 20 
years, but it's pretty clear that you're getting the extra linebreak every 4096 
bytes just like what was happening before with record-oriented files.  This 
will change in 5.14.0 to every 32768 bytes, or you can edit the buffer size 
yourself by modifying perlio.c.

You can see from the fix for that:

http://perl5.git.perl.org/perl.git/commitdiff/5e7d60de18218a624f7f6d5c99bdaf0ff03973df

that I limited it to regular files [S_ISREG(statbuf.st_mode) is true] with 
variable or variable with fixed control.  It occurred to me at the time that 
there might be other record-oriented widgets that need similar treatment, but 
there is danger in casting the net too wide; binary data streams could be 
corrupted, for example.

To me it seems unlikely that DECnet objects would always only transport 
text-oriented data, so it probably isn't safe to line buffer them because that 
would introduce a record boundary for every newline in the data stream, which 
is right for text data but not for binary data.

So I'm not sure what the fix is, or if there is one.  Using a record-oriented 
widget to implement a stream-oriented protocol like HTTP seems like asking for 
trouble, but it is what it is.

The first workaround I would try would be to enable autoflushing with C<$| = 
1;> at the top of your script.  Or you could use syswrite instead of print to 
write your data.

________________________________________
Craig A. Berry
mailto:craigbe...@mac.com

"... getting out of a sonnet is much more
difficult than getting in."
                Brad Leithauser

Reply via email to