in reply to Re: help in ruby code to perl
in thread help in ruby code to perl

While it probably doesn't matter in this case (since the whole file is being read at once), '<:raw' prevents a buffering layer from being added. You want

open(my $fh, '<:perlio:raw', $qfn);
or
open(my $fh, '<', $qfn); binmode($fh);

Same goes for '>:raw'.


The usual idiom is

local $/; my $str = <$FI>;
rather than
read $FI, my $str, -s $FI;

A regex (/(.{40} EMF.*)/s) would be a bit simpler than index+pos+substr and more idiomatic. It could be a bit slower, but probably not since it's optimised to look for " EMF" first.

Replies are listed 'Best First'.
Re^3: help in ruby code to perl
by jwkrahn (Abbot) on Sep 20, 2009 at 17:30 UTC

    In my defence  ;-) I was just trying to do a direct translation.   If I was going to do it in idiomatic Perl I would have done it differently.

    perldoc PerlIO [ SNIP ] :raw The ":raw" layer is defined as being identical to calling " +binmode($fh)" - the stream is made suitable for passing binary data i.e. each byte is pas +sed as-is. The stream will still be buffered.


    Also, you should always verify that open worked correctly before trying to use its filehandle.

       :-)

      binmode($fh, ':raw'); is the same thing as binmode($fh);, but they're not the same as using :raw with open.

      Using binmode :raw disables layers that can be disabled. This doesn't disable buffering if the underlying layer does any.

      Using open :raw prevents some layers from being added in the first place, and this has been shown to prevent buffering.

      $ perl -le'open $fh, "<", "foo"; print for PerlIO::get_layers($fh)' unix perlio $ perl -le'open $fh, "<", "foo"; binmode $fh; print for PerlIO::get_la +yers($fh)' unix perlio $ perl -le'open $fh, "<", "foo"; binmode $fh, ":raw"; print for PerlIO +::get_layers($fh)' unix perlio $ perl -le'open $fh, "<:raw", "foo"; print for PerlIO::get_layers($fh) +' unix

        I'm sorry, I can not find anything in the documentation (so far) that says that open and binmode do different things with :raw.    Could you point me in the right dirrection please?

        Update: Perhaps you are thinking of this section of PerlIO:

        To get an un-buffered stream specify an unbuffered layer (e.g. +":unix") in the open call: open($fh,"<:unix",$path)