Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
PerlMonks  

comment on

( [id://3333]=superdoc: print w/replies, xml ) Need Help??
There are basically two kinds of variables in Perl.
  • Package variables live in the symbol table, and are accessible from anywhere in the program. (In some cases the access requires using a package qualifier.)
  • Lexical variables do not live in the symbol table, and are accessible only from within the lexical scope where they are declared.
However, there are three ways to declare a variable (in the latest version of Perl).
  • use vars qw/ $var /; declares $var as a variable in the current package. Within that package, you can write $var to get that variable. From anywhere, you can write $Pkg::var.
  • my $var; declares $var as a variable in the current lexical scope. Within that scope, you can write $var to get that variable. That's the only way you can access it, and the only place in the code you can access it.
  • our $var; declares $var as a variable in the current package, and sets up $var as an alias to that variable within the current lexical scope. Within that scope, you can write $var to get that variable. From anywhere, you can write $Pkg::var.
Of course, this will be much easier to understand with some examples.

 

Here's an example with use vars. Note that, although the use vars is within a block, it takes effect for the whole file. However, after the switch to package main, $var refers to $main::var.

#!perl -l package Pkg; { use vars qw/ $var /; $var = 7; print $var; # 7 } print $var; # 7 package main; print $var; # undef; $main::var has not been set # error with strict print $Pkg::var; # 7

 

Here's an example with my. Note that only within the lexical block can you access the $var that holds the number 7.

#!perl -l package Pkg; { my $var = 7; print $var; # 7 } print $var; # undef; $Pkg::var has not been set # error with strict package main; print $var; # undef; $main::var has not been set # error with strict print $Pkg::var; # undef; $Pkg::var has not been set

 

Here's an example with our. Note the behavior outside the block before the switch to main; $var refers to the $Pkg::var package variable, but without the package qualifier it would be an error with use strict.
#!perl -l package Pkg; { our $var = 7; print $var; # 7 } print $var; # 7 # error with strict package main; print $var; # undef; $main::var has not been set # error with strict print $Pkg::var; # 7

 

Here's another example with our. Note that, after the switch to package main, $var still refers to $Pkg::var, because we're still in the same lexical scope.
#!perl -l package Pkg; our $var = 7; print $var; # 7 package main; print $var; # 7; even though we switched packages, # $var still refers to $Pkg::var # in this lexical scope print $Pkg::var; # 7
So, both use vars and our declare a variable in the current package. The difference between them is in how you can access the variable. With either one, you can always use $Pkg::var from anywhere. With use vars, you can use $var anywhere in the file, as long as you're in the right package. With our and use strict, you can only use $var within the lexical scope, but you can still use $var after switching packages.

Finally, to answer your question about which of three declarations to use at the top of a script. If you're only accessing the variables from that file, you can use my. If you don't switch to a different package later on in the file, use vars and our are equivalent. If you do switch packages, our could result in surprising behavior, as in the last example above.

 

Update: echo pointed out a few places where I had written $variable instead of $var.

In reply to Re: Our, use vars, and magic, oh my! by chipmunk
in thread Our, use vars, and magic, oh my! by OzzyOsbourne

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":



  • Are you posting in the right place? Check out Where do I post X? to know for sure.
  • Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
    <code> <a> <b> <big> <blockquote> <br /> <dd> <dl> <dt> <em> <font> <h1> <h2> <h3> <h4> <h5> <h6> <hr /> <i> <li> <nbsp> <ol> <p> <small> <strike> <strong> <sub> <sup> <table> <td> <th> <tr> <tt> <u> <ul>
  • Snippets of code should be wrapped in <code> tags not <pre> tags. In fact, <pre> tags should generally be avoided. If they must be used, extreme care should be taken to ensure that their contents do not have long lines (<70 chars), in order to prevent horizontal scrolling (and possible janitor intervention).
  • Want more info? How to link or How to display code and escape characters are good places to start.
Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others meditating upon the Monastery: (2)
As of 2024-04-20 05:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found