in reply to Fill an array in a module ?

First, I would generally avoid using a module-global array. This is because there are plenty of functions which modify the array and thus if you suddenly end up with paths missing you have to figure out what shifted or popped your array. That could be a lot of fun, not....

So while it is true you can declare the array with "our" scope and access it with a fully qualified scope, this strikes me as fairly brittle because such access is read-write.

For this reason I would certainly recommend declaring the array with a "my" scope and having a function that returns a copy of the array. Something like:

my @paths; sub get_paths { init_paths unless @paths; return @paths; } sub init_paths { ... # logic to initialize your path list }

Note this passes the array back by values and thus effectively gives other modules read-only access to it.

Replies are listed 'Best First'.
Re^2: Fill an array in a module ?
by DarrenSol (Acolyte) on Sep 17, 2014 at 17:27 UTC

    I hadn't considered the overwrite problem. Probably because I write perfect script which never oversteps boundaries :P

    At this point, I'm going with a modified version of what you recommend. Instead of using a function to return a copy of the array, the function refills the global 'our' array with the original data.

    My thinking is that since I'll be calling a function to ensure the array I use has the original data, skip the copy and just refill the global 'our' array. None of those arrays are too large, so the file read to fill the array shouldn't impact the run time of the script too much.

    Hmmm. That last sentence brings to mind the phrase "Famous last words." I wonder why...