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

Eg scenario  var.pm {declare v1 v2v1 = "file" v2 = "id" }
a.pl {v1 = "New file" v2 = "New id" }
 b.pl {print v1 v2 ==>this should be printing the updated v1 v2}

Package method I tried. Eventhough I can access the declared value, its not allowing me to change the value globally. Is there any way to solve this in a clean way.

#!/usr/bin/perl package vardeclare; use strict;use warnings; use Exporter; our @ISA = 'Exporter'; our @EXPORT = qw($MASTERLOGFILE); our ($MASTERLOGFILE, $MASTERID); $MASTERLOGFILE="LOGFILE not defined"; $MASTERID="0000000";

Came to know that it can be done using classes, but is there a plain way to do it Any suggestions ???

Replies are listed 'Best First'.
Re: Need to share and modify global variables across modules and packages.
by Anonymous Monk on Jun 21, 2013 at 07:53 UTC
Re: Need to share and modify global variables across modules and packages.
by Preceptor (Deacon) on Jun 21, 2013 at 21:12 UTC

    I'm afraid I'm not sure what you're trying to do, but it looks like a.pl and b.pl are independent pieces of code importing the same module. Is this the case?

    If that's so, then what you're trying to do is just not going to work - what you're trying to do is called inter process communication. Either writing it to a file and reading it back, or something similar. I can give a better example if that _is_ what you're trying to do. Do both a.pl and b.pl have to run concurrently, or do they run separately?

    Otherwise - I tend to like to use subroutines and closures to move vars back and forth

    { my $MASTERLOGFILE = "LOGFILE not defined"; my $MASTERID = "00000000": sub get_masterid { return $MASTERID; } sub set_masterid { ( $MASTERID ) = @_; } }
      Exactly what I am trying to do. Both those scripts run separately and that is where I am getting the issue. Are you saying that, call a perl module to set the variable and use two functions to set the same ?

        Then I'm afraid I have bad news - you cannot do what you're trying to do, the way you're trying to do it. A module is 'static' code - it's imported by your subs when you start them, but it doesn't have any persistent state.

        You may wish to consider reading from a file. At the most basic this goes like (and please note - this is very basic, there's no error or integrity checking):

        { my $state_file = "current_masterid.txt"; my $MASTERLOGFILE; my $MASTERID; sub save_masterid { if ( defined $MASTERID ) { open ( my $output_fh, ">", $state_file ); print $output_fh $masterid; close ( $output_fh ); } } sub load_masterid { if ( -f $state_file ) { open ( my $input_fh, "<", $state_file ); $MASTERID = <$input_fh>; close ( $input_fh ); } else { $MASTERID = "00000000"; $MASTERLOGFILE = "LOGFILE not defined"; &save_masterid() } } sub get_masterid { &load_masterid() unless defined $MASTERID; return $MASTERID; } sub set_masterid { ( $MASTERID ) = @_; &save_masterid(); } }