in reply to Create dynamically different array names based on counter incrementation

You rarely have to create a variable name at runtime: Instead, try using an array of arrays. The first dimension would be your counter, and the second dimension would be your arrays. The syntax would look something like this:

my @Arrays; my $counter=0; open my $IN, '<', $myfile or die; while (my $line = <$IN>) { chomp $line; ++$counter; # Put fields in Array[counter] $Arrays[$counter] = [ split /\t/, $line ]; # Use a single field print "Third column: $Arrays[$counter][2]\n"; }

Read perlref, perldsc and perllol for more details on references, data structures and arrays of arrays.

Untested, you keep all the pieces and other standard disclaimers apply...

Having said all that, if you really want to create variables at runtime, be sure to check out Re: variable with $$ for a thread containing the method on how to do it, as well as references to articles describing why you don't really want to do it.

...roboticus

When your only tool is a hammer, all problems look like your thumb.

Update: Made the fix suggested below by the Anonymous Monk.

  • Comment on Re: Create dynamically different array names based on counter incrementation
  • Download Code

Replies are listed 'Best First'.
Re^2: Create dynamically different array names based on counter incrementation
by Anonyrnous Monk (Hermit) on Jan 21, 2011 at 14:01 UTC
    # Put fields in Array[counter] $Arrays[$counter] = split /\t/, $line;

    I think you meant:

    $Arrays[$counter] = [ split /\t/, $line ];

    or even (with autovivification) — though I consider that less readable:

    @{ $Arrays[$counter] } = split /\t/, $line;

    In scalar context (what you have), split returns the number of fields found (and older versions of Perl did split into the @_ array, issuing a "Use of implicit split to @_ is deprecated" warning).