Thanks - my stupid error.
On Sunday 22 January 2006 12:58 am, Xavier Noria wrote:
> Beau E. Cox wrote:
> > I really thought I understood pack/unpack,
> > but this has me stumped. I can't find anything to
> > explain the operation of the following script
> > in the documentation:
> >
> > use strict;
> > use warnings;
> >
> > my $buffer = pack( "NN", 22, 0 );
> > printf "buffer length = %s\n", length $buffer;
> > print "buffer ",
> > join( " ", map { sprintf "%02x", ord( $_ ) } split "", $buffer ),
> > "\n";
> > my( $len1, $len2 ) = unpack "NN", $buffer;
> > printf "len1 = %s len2 = %s\n",
> > $len1 || 'undef', $len2 || 'undef';
> >
> > which gives this result:
> >
> > $ perl tpack.pl
> > buffer length = 8
> > buffer 00 00 00 16 00 00 00 00
> > len1 = 22 len2 = undef
> >
> > Why is len2 undefined instead of 0? Any ideas?
>
> That test does not show len2 is undefined, you are just seeing that the
> expression
>
> $len2 || 'undef'
>
> evaluates to the string 'undef'.
>
> That's because $len2 is the false value 0, and so || evaluates the right
> operand, which is the string 'undef'. Since the string 'undef' is true
> in boolean context that's what the expression returns. In particular,
> you are not even getting the special scalar value undef, you are getting
> a string that happens to contain the characters 'u', 'n', 'd', 'e', and
> 'f'.
>
> Your understanding of pack/unpack is OK:
>
> % perl -wle '$x = pack "NN", 22, 0; print for unpack "NN", $x'
> 22
> 0
>
> The lesson learned here is that tests of that kind should be as minimal
> as possible.
>
> -- fxn
--
Aloha => Beau;
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>