On Fri, Mar 1, 2013 at 3:37 PM, Chris Stinemetz <chrisstinem...@gmail.com>wrote:

>
>
> On Fri, Mar 1, 2013 at 11:00 AM, Shlomi Fish <shlo...@shlomifish.org>wrote:
>
>> Hi Jim,
>>
>> On Thu, 28 Feb 2013 11:21:59 -0800
>> Jim Gibson <jimsgib...@gmail.com> wrote:
>>
>> >
>> > On Feb 28, 2013, at 10:31 AM, Chris Stinemetz wrote:
>> >
>> > > I want to put a hash declaration in a separate file from the main
>> script.
>> > > How do I do this correctly?
>> > >
>> > > perl.pl ( main script )
>> > >
>> > > #!/usr/bin/perl
>> > > use warnings;
>> > > use strict;
>> > > use Data::Dumper;
>> > >
>> > > require "lib.pl";
>> > >
>> > > print Dumper \%hash;
>> > >
>> > > lib.pl ( library script )
>> > >
>> > > #!/usr/bin/perl
>> > > use warnings;
>> > > use strict;
>> > >
>> > > my %hash = (
>> > >   "Version" => 0,
>> > >   "SRT" => 11,
>> > >   "SRFC" => 12,
>> > >   "CFC" => 21,
>> > >   "CFCQ" => 22,
>> > >   "ICell" => 29,
>> > >   "ISector" => 30,
>> > >   "Cell" => 31,
>> > >   "Sector" => 32,
>> > > );
>> > >
>> > > 1;
>> > >
>> > > The error I am getting:
>> > >
>> > > Global symbol "%hash" requires explicit package name at perl.pl line
>> 8.
>> > > Execution of perl.pl aborted due to compilation errors.
>> >
>> > Put the following line in the main script:
>> >
>> > our %hash;
>> >
>> > Change the "my %hash = ( ... );" declaration in lib.pl to "our %hash =
>> > (...);".
>> >
>> > In your original versions, %hash was a lexical variable in lib.pl, and
>> thus
>> > not in scope within perl.pl. Using 'our' instead of 'my' makes %hash a
>> > package variable (in package main::), and as such is accessible by both
>> > perl.pl and lib.pl, The 'our' declaration also lets you leave off the
>> package
>> > name when you access the variable.
>> >
>>
>> It is a better idea to put this inside a module and export a subroutine
>> for
>> accessing it (or use an object-oriented interface). See:
>>
>> http://perl-begin.org/topics/modules-and-packages/
>>
>> Untested code:
>>
>> <<<<
>> ## This is the file MyModule.pm - don't call it that.
>> package MyModule;
>>
>> use parent 'Exporter';
>>
>> our @EXPORT = (qw(get_ref_to_global_hash));
>>
>> my %global_hash = (
>>         'donald' => 'duck',
>>         'mickey' => 'mouse',
>>         'goofy' => 'dog',
>> );
>>
>> sub get_ref_to_global_hash
>> {
>>         return \%global_hash;
>> }
>>
>> # Module should return a true value.
>> 1;
>> >>>>
>>
>> Regards,
>>
>>         Shlomi Fish
>>
>>
With Shlomi's approach how would I access each element in the %global_hash
within the main script calling the function?

Below is what I have attempted.

**Containers.pm**

## This is the file Containers.pm
package Containers;

use parent 'Exporter';

our @EXPORT = (qw(get_global_hash));

my %global_hash = (
        'donald' => 'duck',
        'mickey' => 'mouse',
        'goofy' => 'dog',
);


sub get_global_hash
{
        return \%global_hash;
}

1;

**try.pl**

#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;

use Containers;

print "Hello", "\n";

# our %global_hash;

print get_global_hash;

# print Dumper \%global_hash;

Reply via email to