Je55eah has asked for the wisdom of the Perl Monks concerning the following question:

use strict; use warnings; my %v; $v{hourly_worker_expenses} = { # elaborate on this ! 'all' => 16 }; $v{hourly_worker_cost} = &{sub { my $cost = 0; my $item; my %costs = $v{hourly_worker_expenses} +; #print %costs; foreach $item ($costs) { $cost += $costs{$item}; } #print $cost; return $cost; } }(); print $v{hourly_worker_cost};

There is something about hashes that is screwing me up. Thanks,

Global symbol "$costs" requires explicit package name at test.pl line +13. Execution of test.pl aborted due to compilation errors.

I have tried so many different things, but here are some of them:

my %costs = \$v{hourly_worker_expenses}; my $costs = $v{hourly_worker_expenses}; my $costs = \$v{hourly_worker_expenses}; I originally didn't even mess around with the $costs/%costs hash and I + tried to do the += with $cost and $v{hourly_worker_expenses}

Thanks for looking,

Replies are listed 'Best First'.
Re: Please help me find my error.
by muba (Priest) on Jun 21, 2012 at 23:25 UTC

    foreach $item ($costs)
    You probably mean foreach $item (keys %costs). Note the use of the keys keywords so that you only loop over the keys of %costs, so that you can then do $cost += $costs{$item};

    You wrote $costs, you probably meant %costs.


    my %costs = $v{hourly_worker_expenses};
    This also probably isn't what you meant, because earlier you assigned a hashref to that slot. And hashrefs need to be dereferenced. The line should probably read my %costs = %{$v{hourly_worker_expenses}};

    HTH.

Re: Please help me find my error.
by Je55eah (Novice) on Jun 22, 2012 at 00:07 UTC
    Global symbol "%expenses" requires explicit package name at test.pl li +ne 13. Global symbol "%expenses" requires explicit package name at test.pl li +ne 15. Execution of test.pl aborted due to compilation errors.

    Here is the modified code.

    use strict; use warnings; my %v; $v{hourly_worker_expenses} = { # elaborate on this ! 'all' => 16 }; $v{hourly_worker_cost} = &{sub { my $cost = 0; my $item; my %expenses = %{$v{hourly_worker_expe +nses}}; # fixed typo $expensess foreach $item (keys %expenses) { $cost += $expenses{$item}; } return $cost; } }(); print $v{hourly_worker_cost};
      I found the typo. Thanks guys. Sorry about the premature followup.,
Re: Please help me find my error.
by Anonymous Monk on Jun 21, 2012 at 23:31 UTC
    foreach $item ($costs)

    I believe that $costs is the problem. I expect you meant something like...

    foreach $item (keys %costs)