Brian Volk wrote:
>
> I have a couple of questions from chapter 4 in the Alpaca book.
>
> Everything is working fine but I keep getting "I don't understand
> blue_shirt" whether I create the anonymous array w/
>
> $provisions{$person} = [] unless exists $provisions{$person};
>
> Or if I comment out the above line and allow autovivification to create
> it.  Could someone pls explain what I am not understanding?
>
> Below is the exact code from the Autovivification section... and sample
> data.
>
>  #!/usr/bin/perl
>
>  use strict;
>  use warnings;
>
>  my %provisions;
>  my $person;
>
>  while (<>) {
>
>    if (/^(\S.*)/) { # a persons name (no leading white spaces)
>      $person = $1;
>      $provisions{$person} = [] unless exists $provisions{$person};
>    }elsif (/^s+(\S.*)/) { # a provision
>      die "No person yet!" unless defined $person;
>      push @{ $provisions{$person} }, $1;
>    } else {
>      die "I don't understand: $_";
>    }
>
>  }
>
>  ___DATA___
>
>  The Skipper
>   blue_shirt
>   hat
>   jacket
>   perserver
>   sunscreen
>  Professor
>   sunscreen
>   water_bottle
>   slide_rule
>  Gilligan
>   red_shirt
>   hat
>   lucky_socks
>   water_bottle
>
>
>  Thank you! (Great book BTW!!)  :-)

Hi Brian.

The reason your program is failing is that you don't have a backslash before the
's' in the elsif condition. The pattern is looking for a record that starts with
an s and doesn't find one - it's nothing to do with the autovivication of the
hash element. It should read:

  elsif (/^\s+(\S.*)/)

By the way, the __DATA__construct is a valid Perl one, except that it has two
underscores before and after instead of your three. I at first thought there was
a problem that you were reading using <> instead of <DATA> until I realised that
you meant it just as a caption for the data in your message.

I hope this helps.

Rob

--
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