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

Hey there, I have a minor problem with my code, I am trying to write this code with "use strict" but it is throwing error.

use strict; use warnings; use Data::Dumper my %count; open FILE, "test.log"; while (<FILE>){ my @fields = split; $count{$fields[1]}++; } print Dumper \%count;

I feel I am doing right, but perl doesn't quite agree. I am getting the error

Global symbol "%count" requires explicit package name at test.pl line +11. Global symbol "%count" requires explicit package name at test.pl line +14. Execution of test.pl aborted due to compilation errors.

What is wrong with my variable declaration? Of course it works with "use strict" commented, but the fact that it is throwing error means I am doing something wrong. Can someone correct me please?

Replies are listed 'Best First'.
Re: Help on variable declaration with "use strict "
by thezip (Vicar) on Jun 01, 2011 at 16:22 UTC
    You are missing a semi-colon in line 3, ie. use Data::Dumper;


    What can be asserted without proof can be dismissed without proof. - Christopher Hitchens
Re: Help on variable declaration with "use strict "
by toolic (Bishop) on Jun 01, 2011 at 16:23 UTC
    use Data::Dumper
    Add a semicolon:
    use Data::Dumper;

    B::Deparse can help to get a little more information (Tip #6 from Basic debugging checklist):

    $ perl -MO=Deparse test.pl Global symbol "%count" requires explicit package name at test.pl line +11. Global symbol "%count" requires explicit package name at test.pl line +14. test.pl had compilation errors. use Data::Dumper (my %count); use warnings; use strict 'refs'; open FILE, 'test.log'; while (defined($_ = <FILE>)) { my(@fields) = split(' ', $_, 0); 'count'->{$fields[1]}++; } print Dumper(\(%{'count'}));
    Here it shows that my %count looks like it's being passed to Data::Dumper.
      Thanks! That was very helpful! The Deparse module looks great for beginners like me.
Re: Help on variable declaration with "use strict "
by Anonymous Monk on Jun 01, 2011 at 16:30 UTC

    damn.. that is right! Since I am a newbie I have little confidence in my understanding of the concepts. So it made me suspect the declaration instead of checking the syntax. Apologies.

      It was hard to spot. The reason it's a strict error is that
      use Data::Dumper my %count;

      is the same as

      BEGIN { require Data::Dumper; import Data::Dumper my %count; }

      The curlies of the implicit BEGIN limited the scope of the lexical.