in reply to scoping large arrays - newbie Q

It's a little hard to know exactly what you're talking about since you didn't include any code. But my guess is you need to learn about references. With references you can create an array in one function and pass it to another without paying the penalty to recreate it. This is known as "pass-by-reference" to comp-sci geeks. Here's an example:

sub foo { my @array = ( 0 .. 100 ); # create a new array bar(\@array); # pass it to bar() by reference } sub bar { my $array_ref = shift; # get reference to foo()'s array foreach (@$array_ref) { # print out each value print; } }

If this is your first encounter with references then you've got some learning to do. I suggest you pick up a copy of Learning Perl or Programming Perl and dig in!

-sam

Replies are listed 'Best First'.
Re: Re: scoping large arrays - newbie Q
by moof1138 (Curate) on Jun 18, 2002 at 04:40 UTC
    Thank you for the response. I do know about using references, I have used them here and there to pass something to a function that was not in that function's scope. That's not really what I am looking for here. I was not clear enough. I just really wonder whether it is more efficient to set up my array at point A, or point B in the pseudocode below which is trying illustrate my question:
    #!/usr/bin/perl -w use strict; my @bigarray = ("insert", "a very", "long list here");#point A my $thing1 = mySub(); my $thing2 = mySub(); #...etc - using mySub repeatedly sub mySub { #point B - should I declare my @bigarray here instead, and why? for (@bigarray){ #do stuff with array } }
      Can I choose point C? Here's an alternative:

      { my @bigarray = ("insert", "a very", "long list here"); # c sub mySub { for (@bigarray){ # do stuff with array } } }

      This keeps @bigarray private to the subroutine but only initializes it once. You get the best of both worlds at no added cost!

      -sam

        I second that.

        -Lee

        "To be civilized is to deny one's nature."
      With the example you have given, i say point A, because if you declare your array at point B, you will re-declare it as many times as you call mySub(). Also, consider passing @bigarray to mySub() as a reference. Just be sure to declare mySub() before @bigarray, otherwise @bigarray is accessible by mySub():
      use strict; sub mySub { my $ref = shift; for (@$ref) { #do stuff with array } } my @bigarray = ("insert", "a very", "long list here"); my $thing1 = mySub(\@bigarray); my $thing2 = mySub(\@bigarray);
      If the array in question is only pertinent to the subroutine, and either that sub will only be called once or the array will change with each sub call, then declare the array inside the subroutine.

      jeffa

      L-LL-L--L-LL-L--L-LL-L--
      -R--R-RR-R--R-RR-R--R-RR
      B--B--B--B--B--B--B--B--
      H---H---H---H---H---H---
      (the triplet paradiddle with high-hat)