in reply to Need to share and modify global variables across modules and packages.

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 ) = @_; } }
  • Comment on Re: Need to share and modify global variables across modules and packages.
  • Download Code

Replies are listed 'Best First'.
Re^2: Need to share and modify global variables across modules and packages.
by mathew_p_a (Initiate) on Jun 26, 2013 at 10:19 UTC
    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(); } }