Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Re: Using Global Variables in Perl

by TGI (Parson)
on Apr 22, 2008 at 17:50 UTC ( [id://682233]=note: print w/replies, xml ) Need Help??


in reply to Using Global Variables in Perl

Global variables are generally to be avoided. If you must use them and have strict vars enabled, you must specify their package as well as their name: $main::foo.

You should take a look at perlmod, perlmodstyle, and perlmodlib. They have some good information about how to write and use modules.

A few things in your code sample jump out at me. I took the liberty of rewriting your code below. I haven't tested it, so there may be errors.

# Save this file as 'MyModule.pm' package MyModule; # declare your module to be in a package, use strict; use warnings; # warnings can help catch logic errors, and typos use Carp; # issue warnings from calling code. my %HANDLE_MODES = ( # replace globals with package scoped lexical t +hat is NOT accessed outside the file. READMODE => '<', WRITEMODE => '>', APPENDMODE => '>>', ); sub openFile { my $file = shift; # shift automatically works with @_ my $mode = shift; # use strings to match keys in %HANDLE_MODES in +stead of global variables. # check to see if valid mode in call. if( exists $HANDLE_MODES{$mode} ) { # open a lexical filehandle, capturing any errors my $fh; my $error = open( $fh, $mode, $file) ? undef : $!; # return filehandle and error string. return ( $fh, $error ); } else { # if mode is bad issue error message pointing to calling code. croak "Illegal file handle mode '$mode'" } } 1;

Calling code:

use strict; use warnings; use MyModule; # load your module. # call openFile. my ($fh, $error) = MyModule::openFile('my/file/here.txt', 'READMODE' ) +; # Check results if ( $fh ) { # file opended ok, process file. # reading from a lexical handle works just like a global handle. while ( defined ( $foo = <$fh> ) ) { # do stuff } } else { # File did not open, show error. warn "Error opening file- $error\n"; }

I hope this helps.

Update: I forgot to make sure that the module example returned a true value. Fixed it. I told you I didn't test the code :)


TGI says moo

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://682233]
help
Chatterbox?
and the web crawler heard nothing...

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

    No recent polls found