in reply to Hex Embedded Images

I have to agree - it IS cool.

But when I try BBQ's code to unpack an image to hex, I receive the following error:

Too many arguments for substr near "'')" Execution aborted due to compilation errors

Suggestions from more advanced brothers ?

Perl 5.004
Debian 2.1

update 6-28-2000 : btrott pointed out that substr in Perl 5.004 is different, and provided this code (that does work with 5.004)

while ($txt = substr($hex, 0, 32)) { substr($hex, 0, 32) = ""; print "'$txt'\n"; }

Thanks also to swiftone, chromatic, and of course BBQ.
    ybiC

Replies are listed 'Best First'.
RE: RE: Hex Embedded Images
by BBQ (Curate) on Jun 28, 2000 at 18:44 UTC
    That's probably because you copied the code from my home node yesterday. I had binmode in the wrong place (after undef $/, not a good thing) and one thing probably lead to another. Is this what you have?
    #!/usr/bin/perl open(IMG,'foo.gif') or die("Couldn't open image: $!\n"); binmode(IMG); undef($/); $image = <IMG>; $hex = unpack("H*", $image); close(IMG); while ($txt = substr($hex,0,32,'')) { print "'$txt'\n"; }


    #!/home/bbq/bin/perl
    # Trust no1!

      Yeah, I did copy it yesterday, but I still get this error:

      Too many arguments for substr at ./gif2hex.perl line 17, near "'')" Execution of ./gif2hex.perl aborted due to compilation errors.

      with today's code from your home node:

      #!/usr/bin/perl -w # Description: Hex embedded images sample # Date: June 28, 2000 # Author: bbq@zaz.com.br # URL: http://johnny.warp.psi.br/perl/images.pl?img=text open IMG, "./arrow.gif" or die "Couldn't open image: $!\n"; binmode(IMG); undef $/; $image = <IMG>; $hex = unpack("H*", $image); close IMG; while ($txt = substr($hex,0,32,'')) { print "'$txt'\n"; } # END

      Thanks for you help - hope I'm not missing something obvious.
      This is definately CUFP.
          ybiC

        You're getting this compilation error because you have an older version of Perl. I'm guessing Perl 5.004 or something? Or less, perhaps.

        That version of substr wasn't added until 5.005. In the docs:

        An alternative to using substr() as an lvalue is to specify the replacement string as the 4th argument. This allows you to replace parts of the EXPR and return what was there before in one operation, just as you can with splice().
        You'll probably have to make do w/ a two-step operation; first get the first 32 characters using substr, then strip the first 32 characters:
        while ($txt = substr($hex, 0, 32)) { substr($hex, 0, 32) = ""; print "'$txt'\n"; }
        See if that works for you.