Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

So, I have a package scoped hash %id
# identity.pm package id; use strict; use warning; use Exporter; our @ISA = qw(Exporter); our @EXPORT = qw (%id); our $id = ( Name => "Sally", Age => "23"); );
and I have another perl script that access $id and updates it...
# file1.pl use id; use strict; use warning; $id{Name} = "Jim"; $id{Age} = 16;
Now I have another script that runs after the previous script (file1.pl). The problem is when I access %id in this script (file2.pl), I want the updated %id values (Jim, 16), but I'm getting the original values ("sally", 23). How would I share package values across files and have updates reflected during each access? Thanks!

Replies are listed 'Best First'.
Re: How to update package scoped variables across files?
by hippo (Archbishop) on Aug 25, 2015 at 22:45 UTC

    You are asking for some means of storing state. Typically this could be achieved by tying the hash to a file. There are many, many modules to help with this.

Re: How to update package scoped variables across files?
by LanX (Saint) on Aug 26, 2015 at 01:32 UTC
    Looks like you neither need a hash nor exporter, just fully qualified names.

    $id::Name = "Jim"; $id::Age = 16;

    But I would rather prefer to upper case the package name to 'ID'.

    Cheers Rolf
    (addicted to the Perl Programming Language and ☆☆☆☆ :)
    Je suis Charlie!

Re: How to update package scoped variables across files?
by 1nickt (Canon) on Aug 26, 2015 at 00:16 UTC

    Hi, welcome to the monastery. Please take a look at http://www.perlmonks.org/?node_id=174051 which includes:

    Here's the short version: If you want to get good answers: Paste actual code that reproduces the + problem between <code> and </code> tags.

    This usually means you should be able to copy the code you post, paste it into a text file and have Perl run it. Since your file is a package I just did perl -c filename on it.

    The code you posted doesn't compile. The pragma is called warnings not warning. And although you export a hash, you declare a hashref (although you do try to populate it as if it were a hash, so I can't tell which typo is which).

    You obviously tried to make a demo script, so kudos for that ... but you should take time to check it. As far as what you are trying to do: as hippo said, there are many solutions. Try just printing the hash out to a file and then opening it in the next script. That's a completely wrong way to do it for "production" -- there are modules that do the same thing but with tons of error-handling and portability etc) -- but it would be good practice in working with files...

    The way forward always starts with a minimal test.
Re: How to update package scoped variables across files?
by Monk::Thomas (Friar) on Aug 26, 2015 at 09:31 UTC

    I have another perl script that access $id and updates it... [...] Now I have another script that runs after the previous script (file1.pl). The problem is when I access %id in this script (file2.pl), I want the updated %id values (Jim, 16), but I'm getting the original values ("sally", 23). How would I share package values across files and have updates reflected during each access?

    From what I understand you want to set the variables via file1.pl:

    # this is file1.pl use id; $id{Name} = "Jim";
    and then later on call file2.pl and get the previously set value:
    # this is file2.pl use id; print $id{Name};

    ...and expect id.pm to magically store the value 'Jim' and his age?

    This will not work. What you need to do is to write 'Jim' to disk and later on read that value from disk.

    LanX' answer is misleading because it will not help you solve your problem. (The advice itself is correct, it just fails to solve your problem.)

    hippo's answer points to one possible solution but may be a bit hard to understand. (What he suggests is to replace a simple 'memory-backed' hash with something that still looks like a hash, but is actually stored in the filesystem, this is achieved by 'tie'-ing a hash to a file.) Another option would be to manually write the data to the filesystem. This either requires 'file1.pl' and 'file2.pl' not to run at the same time or to make them aware of changes in the underlying file and handle them properly.