in reply to my() and our()

The second "our" does create a new lexical variable, but it is aliased to the package variable. Effectively, it is the same variable.

If you wanted to localize it, you need to use "local".

In practice, it would be very rare to find code using "our" inside a block. It is typically used at the top of the file, because it declares (package) global variables.

Even if you did use "our" inside of a block, it just gives you access to the global variable for that block only.

Note: None of this really matters until you say "use strict". Without strict, you can use global variables anywhere. With strict, you must use "our" to declare the variables.

Replies are listed 'Best First'.
Re^2: my() and our()
by DrWhy (Chaplain) on Aug 09, 2005 at 22:08 UTC
    There are actually uses (well, at least one that I can think of) for our beyond use 'strict' context. I have had occasion to use our at the top of a file that contained multiple packages so that I could have a package global that was accessible without full qualification throughout the file. E.g.:

    package X; our $global = 'Xglobal'; ... more stuff here ... package Y; print $global;

    When run, this code prints Xglobal even though the reference to $global is in package Y's space and it was defined as being a global in package X. The our makes all unqualified references to the variable be assumed to be in the X package namespace even after you move into a different namespace. The same effect can be obtained with my(), except that then the variables are not accessible to other perl code that uses/requires this code.

    --DrWhy

    "If God had meant for us to think for ourselves he would have given us brains. Oh, wait..."