Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

Re^3: How to import "global" variables into sub-scripts from main script?

by bliako (Monsignor)
on Mar 23, 2021 at 17:03 UTC ( [id://11130217]=note: print w/replies, xml ) Need Help??


in reply to Re^2: How to import "global" variables into sub-scripts from main script?
in thread How to import "global" variables into sub-scripts from main script?

But I think I will put that Variables.pm file to practice shortly

right but beware that there may be dragons if you modify those variables in subscripts. There may be cases (which I am not aware of, I am not a Perl expert) where changing a package variable will not be reflected to other users of said package (e.g. one of your various subscripts). For read-write variables it's not a good way and I will not use myself.

some here seem bent on forcing me into their mold

Oh come on! (respectfully said). From my experience this is hardly the case with PM (compare to Stack overflow by posting this exact question there -- even your super-ground -- good story btw -- will not protect you from the flaming lightnings they will throw at you). Perl is a fertile ground for TIMTOWTDI and Perl culture preaches it. Perl allows you to do a lot of things, even shooting your foot, some people, understandably frown on extremely un-productive or buggy solutions which can lead to future problems (e.g. maintainability). If I may say so (and I don't wish to start a conversation about this side-issue): saying that your case is special because you are the only maintainer, is not an argument to the good points presented here (about general programming practices at least). You are offered good solutions which require that you change some of your programming habits, "change gear", "grow up" as a user of a programming language. Case-in-point is OO (actually the free style of Perl OO). It can reduce code-lines (which you are interested) tremendously by re-using code, it can encapsulate data and transformations which will make your code more maintainable, easier to handle. It does not require super-human abilities but it requires to program along certain "molds". And btw the -> is used just as you will be using it in a hashref (which essentially is what an OO object is, a mere hashtable with data AND subs as values). Try posting a question about OO and see what happens.

bw, bliako

Replies are listed 'Best First'.
Re^4: How to import "global" variables into sub-scripts from main script?
by choroba (Cardinal) on Mar 23, 2021 at 18:09 UTC
    > There may be cases (which I am not aware of, I am not a Perl expert) where changing a package variable will not be reflected to other users of said package

    Do you mean mod_perl and similar parallel preloading environments?

    map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]

      I don't know a lot about mod_perl so I did not have that in mind. Parallelism can be an issue when modifying package vars in different threads (as with anything else). But as there are different ways to import a module (e.g. use, require but especially do (and eval) which asker uses a lot) and there are also ways to reload a module at runtime (e.g. Module::Refresh) I thought it's better to leave a questionmark there rather than being absolute. Given also that there are other safer ways to achieve read-write effect. Personally I can't stand things like: $DBI::errstr, whereas $XYZ::DEBUG = 1 is tolerable.

      What's your opinion? Can we rely on the state of a package's variables modified after loaded (not in mod_perl, threads)?

        My opinion? Writable global variables are bad. Having a writer is much better as you can intercept it, which allows to debug it, wrap it, log it, etc. Global constants are basically OK, but it's still suspicious if a certain value is needed in several different places - maybe they should be moved closer together?

        The situation in mod_perl like environment is easy to demonstrate. But let's be more modern, it applies to plack as well, for example:

        #!/usr/bin/perl use warnings; use strict; use Plack::Builder; our $global = 1; my $app = sub { my $env = shift; my $status = 200; my $headers = ['Content-type' => 'text/html']; return [$status, $headers, [$global++]] }; builder { mount '/' => $app; };

        Now run it as (sorry for *nix shell, but that's what I run)

        plackup -s Starman --workers 2 11130232.pl

        Now run several requests in parallel, e.g.

        for i in {1..100} ; do curl http://localhost:5000 & done

        and check what the global state is several times:

        $ curl [HTTP://localhost:5000] 55 $ curl [HTTP://localhost:5000] 47

        Each worker keeps its own state, but you never know which one you'll hit.

        map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11130217]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others admiring the Monastery: (5)
As of 2024-04-25 08:08 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found