newbie_coder has asked for the wisdom of the Perl Monks concerning the following question:

Greetings Monks, I am using an array variable @net_pnics in a module NET.pm. There is a subroutine in this module which fills the array with suitable values. This subroutine is called from Main_Input.pl.After calling this subroutine, the control returns back to Main_Input.pl. Now, when I call the subroutine in NET.pm again, the data in the array variable is lost. I have tried using our @net_pnics in NET.pm, but of no avail. I want the array to retain its data till the time program is being run, until and unless that specific subroutine to fill the array is called. Please help...

Replies are listed 'Best First'.
Re: Using static variable in perl
by Corion (Patriarch) on Mar 08, 2011 at 11:27 UTC
      Note that one can only create scalar static variables. So the OP should use an arrayref instead of an array if the OP decides to use a static variable.
        No, state works just fine with arrays and hashes.
        #!/ActivePerl/bin/perl use strict; use warnings; use feature (qw/state say/); store_and_print_hash('a'); store_and_print_hash('b'); store_and_print_hash('c'); store_and_print_array('x'); store_and_print_array('y'); store_and_print_array('z'); sub store_and_print_hash { state %hash; my $key = shift; $hash{$key} = 1; say "Hash keys: (" , join(', ' , sort keys %hash), ")"; } sub store_and_print_array { state @array; my $value = shift; push @array, $value; say "Array values: (" , join(', ' , @array), ")"; }
        results in
        Hash keys: (a) Hash keys: (a, b) Hash keys: (a, b, c) Array values: (x) Array values: (x, y) Array values: (x, y, z)
        -- Am I the only one who still cares about RT #67694?
Re: Using static variable in perl
by Eliya (Vicar) on Mar 08, 2011 at 11:37 UTC
    the data in the array variable is lost. I have tried using our @net_pnics

    You haven't shown any code, but I suspect you're checking in the wrong namespace (i.e. not Net::).

    In other words, either use fully-qualified names

    package Net; our @net_pnics; sub fill_array { @net_pnics = qw(foo bar); } 1;
    #!/usr/bin/perl -wl use strict; use Net; Net::fill_array(); print "@Net::net_pnics"; # "foo bar"

    or use Exporter to export the variable into the namespace of the script Main_Input.pl.