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

I'm a newbie at this, and I've been given a very large program to manage, and I'm just trying to add some code, but I get the following error:

Global symbol "$shipment_request_id" requires explicit package name at /apollo/env/fulfillmentCenter/bin/collate-tool.new line 297.

It is created with:

my $shipment_request_id = $row_r->{shipment_request_id};

at line 172, inside of an if statement. At line 297 (where the complaint is heard) I'm simply trying to use it. Now, I'm using it inside of yet another if statement.

So my question, generally, is concerning the scope of perl variables. How do you create global variables that can be seen at all points of your program?

Oh, and line 297 is:

$esdSummaryBlock .= " <tdx align=center>$shipment_request_id</tdx>\n";

I had to changet the td tag to tds just to get it past the perlmongers editor.

Replies are listed 'Best First'.
Re: Global Variables
by Cubes (Pilgrim) on Nov 27, 2007 at 22:13 UTC
    Put a my $shipment_request_id before the if block, in the same block where you later use the variable (and remove the my inside the if).
      Wonderful, that did it. So, you need to define variables before getting into a block, because if you declare them in a block, they are local to the block?
        Yes. Each block is a scope. Even bare curlies (without any flow control statements) make a block.
        use strict; { my $foo = 2; { my $foo = 1; # masks outer $foo my $bar = $foo; print "foo is '$foo'\n"; # foo is '1' } print "foo is '$foo'\n"; # foo is '2' print $bar; # # error, $bar not visible here my $foo; # warning: $foo already declared # as lexical in this scope. } print "foo = $foo\n"; # error, $foo not visible here

        --shmem

        _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                      /\_¯/(q    /
        ----------------------------  \__(m.====·.(_("always off the crowd"))."·
        ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}
        Exactly.
        Well...close, but not exactly. If you are using "use strict", which you evidently are, this is 100% correct. But you should know that without the strict option, a variable can be declared anywhere simply by using it. When not using the strict constraints, the best way I know to describe scoping is "global once declared".
Re: Global Variables
by moritz (Cardinal) on Nov 27, 2007 at 22:20 UTC
    It's not a good idea to declare a variable inside an if-block when you want to use it in the surrunding block - what happens if the if-condition is false and it's not executed?

    The solution is to declare the variable in an outer scope:

    my $new_variable; if ($condition){ # initialize $new_variable here } # far down below, you can still use $new_variable.
Re: Global Variables
by jdporter (Paladin) on Nov 28, 2007 at 03:52 UTC
    I had to changet the td tag to tds just to get it past the perlmongers editor.

    That's because you didn't put your code inside <code> tags. Please read Writeup Formatting Tips.

    A word spoken in Mind will reach its own level, in the objective world, by its own weight