in reply to Perl + Unicode == Networking Woes

Why not replace your sysread and syswrite calls to use read and write instead?

Updated: Opps, I have realized my silly mistake on the syswrite/write bit. Thanks to monks who have pointed it out. I guess it's still too early in the morning, and I need more coffee. :-p

Replies are listed 'Best First'.
Re: Re: Perl + Unicode == Networking Woes
by William G. Davis (Friar) on Nov 24, 2003 at 20:55 UTC

    Because read() is almost just a buffered sysread() (perldoc -f read):

    read FILEHANDLE,SCALAR,LENGTH,OFFSET
    read FILEHANDLE,SCALAR,LENGTH
            Attempts to read LENGTH bytes of data into variable SCALAR from
            the specified FILEHANDLE. Returns the number of bytes actually
            read, "0" at end of file, or undef if there was an error. SCALAR
            will be grown or shrunk to the length actually read. If SCALAR
            needs growing, the new bytes will be zero bytes. An OFFSET may
            be specified to place the read data into some other place in
            SCALAR than the beginning. The call is actually implemented in
            terms of stdio's fread(3) call. To get a true read(2) system
            call, see "sysread".
    

    and write() is absolutely nothing like syswrite(). It's used for printing formats (perldoc -f write):

    write FILEHANDLE
    write EXPR
    write   Writes a formatted record (possibly multi-line) to the specified
            FILEHANDLE, using the format associated with that file. By
            default the format for a file is the one having the same name as
            the filehandle, but the format for the current output channel
            (see the "select" function) may be set explicitly by assigning
            the name of the format to the "$~" variable.
    
            Top of form processing is handled automatically: if there is
            insufficient room on the current page for the formatted record,
            the page is advanced by writing a form feed, a special
            top-of-page format is used to format the new page header, and
            then the record is written. By default the top-of-page format is
            the name of the filehandle with "_TOP" appended, but it may be
            dynamically set to the format of your choice by assigning the
            name to the "$^" variable while the filehandle is selected. The
            number of lines remaining on the current page is in variable
            "$-", which can be set to "0" to force a new page.
    
            If FILEHANDLE is unspecified, output goes to the current default
            output channel, which starts out as STDOUT but may be changed by
            the "select" operator. If the FILEHANDLE is an EXPR, then the
            expression is evaluated and the resulting string is used to look
            up the name of the FILEHANDLE at run time. For more on formats,
            see the perlform manpage.
    
            Note that write is *not* the opposite of "read". Unfortunately.
    
    

    And regardless, write() too uses Perl's stdio buffering, which means even if it did what its name implies, it couldn't be used for robust network IO.