in reply to Re: Understanding difference between my and local variables.
in thread Understanding difference between my and local variables.

That removes lot of confusion. Still some questions. Let me get this terms understood

When You say Package variable, then you mean global variable. So global and package variable are one and same, correct ? What if, I declare a package variable and that variable does not exist in the package. Will that variable be created in the package ?

If a variable is declared without "my" prefix, thats a global variable or package variable, right ? If a variable is declared with "my" prefix, then its lexical variable, right ?

If a variable is not declared as global variable (package variable) say $x, then can we still use this variable $x as local variable ? Or variable has to be declared as global variable in order to assign it local scope ?
  • Comment on Re^2: Understanding difference between my and local variables.

Replies are listed 'Best First'.
Re^3: Understanding difference between my and local variables.
by JavaFan (Canon) on Oct 15, 2010 at 05:57 UTC
    So global and package variable are one and same, correct ?
    No. Global just means it can be accessed globally. Lexical variables may be global. If your program is just one file, and my declare "my $foo;" at the top of the file, that variable will be global.

    Depending on what you mean by "global variable" exactly, either all package variables are global (because you always get to their values from anywhere in the program), or they are only global when their name is declared in the other scope (because getting to the value from other scopes requires fully qualified names).

    What if, I declare a package variable and that variable does not exist in the package. Will that variable be created in the package
    That depend on your point of view. Do you want to look at from the language POV? Then the answer is no. Package variables always exist. Implementation wise, however, means that a variable may be created when "declared". use vars and our may create the variable. But the variable may already exist - and the our (or use vars) statement just means the variable is known by a different name during the compilation process.
    If a variable is declared without "my" prefix, thats a global variable or package variable, right
    Right.
    If a variable is not declared as global variable (package variable) say $x, then can we still use this variable $x as local variable
    Yes, but it will be a different one. You cannot localize a lexical variable (but you can localized elements of lexical arrays and hashes, go figure). Such a local statement will introduce a package $x. I strongly advice as such coding practise.
Re^3: Understanding difference between my and local variables.
by ikegami (Patriarch) on Oct 15, 2010 at 07:12 UTC

    When You say Package variable, then you mean global variable.

    When you say global, you mean package variable.

    Package variables are global. Loosely speaking, people also call file-scoped lexicals global variables, so you can have global lexical variables too.

    What if, I declare a package variable and that variable does not exist in the package. Will that variable be created in the package ?

    Declaring means to make exist. Your condition is a contradiction (never true).

    If a variable is declared without "my" prefix, thats a global variable or package variable, right

    How are you declaring it?

    use vars qw( $var ); declares a package variable.

    our $var; declares a package variable. (Not exactly, but it's a useful simple way of thinking of it.)

    If a variable is not declared as global variable (package variable), then can we still use this variable $x as local variable ?

    I think you're asking if you can use local can be used on variables other than package variables. Yes.

    • Package variables
    • Array elements
    • Hash elements

    Note that it doesn't matter if the package variable was declared or not.