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>


Reply via email to