http://qs1969.pair.com?node_id=1102137


in reply to Seeking the right way to override global variables

It is usually a good idea to put "global variables" into a Common module of some kind, perhaps which exposes an object that simply serves as the repository of those values. When you do it this way, it's always obvious that you're referring to a widely-used variable ... and it's therefore always obvious when and where it's being used throughout a potentially very-large application. Be sure to use strict; use warnings; everywhere.
  • Comment on Re: Seeking the right way to override global variables

Replies are listed 'Best First'.
Re^2: Seeking the right way to override global variables
by contra-sh (Acolyte) on Sep 26, 2014 at 15:06 UTC
    When you say :

    "It is usually a good idea to put "global variables" into a Common module of some kind, perhaps which exposes an object that simply serves as the repository of those values."

    Do you mean explicit package + object oriented?

    I already use a separate perl module and I'm thinking using explicit package name in addition. But I don't want to put object oriented programming with the rest of the code, which is not.

    But I fully agree with you that explicit package name is a better practice (even for small projects like mine, it doesn't hurt).

    And yes I already put use strict and use warnings everywhere :D

    Thank you for your answer.
      Then you could use a pseudo-object, for example storing your global variables in a lexical hashref in the const module, and have in that same module a get and a set functions to access the hash that you export. Something like this:
      use strict; use warnings; use Exporter; our @ISA = 'Exporter'; our @EXPORT = qw(get set); my $private_hash_ref = {VAR1 => "one", VAR2 => "two"}; sub get { my $key = shift; return $private_hash_ref->{$key};} sub set { my ($key, $value) = @_; $private_hash_ref->{$key} = $value;}
      And then in your main code or other module, you just use the set and get functions.