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

I have a simple Perl script that reads some input variables from a text file. The variables are a comma separated list. I want them in an array, but I only know how to read them into a scalar and then split them. Is there a way do this in one step?

Here's some simple test code, I am playing around with:

opendir (DIR, ".") or die "$!"; my @files = grep {/conf.*?\.txt/} readdir DIR; close DIR; print"\nNo input files found.\n" if scalar(@files)==0; foreach my $file (@files) { my $content = do { local( @ARGV, $/ ) = $file ; <> } ; print "parsing $file...\n"; my ($inc_vals)=$content=~/inc_vals=(.*?)\n/ my @inc_vals=split(/, /, $inc_vals) unless $inc_vals=~/^\s$/; } foreach my $value (@inc_vals) { print "$value\n"; }

If it's relevant, I am using Strawberry Perl 5.10.1 on W7 x64.

Replies are listed 'Best First'.
Re: Slurping strings from text file and pushing to array?
by shawnhcorey (Friar) on Jul 01, 2010 at 23:48 UTC
Re: Slurping strings from text file and pushing to array?
by ikegami (Patriarch) on Jul 01, 2010 at 21:05 UTC

    <> returns a list of lines in list context.

    my @content = do { local @ARGV = $file ; <> } ;

      Thanks, but wouldn't that put each line of the text file as an element in an array? What I need is each line to be it's own array and each comma separated chunk of text to be an element in one of those arrays.

      Or am I mis-understanding?

        my @lines; @ARGV = $file; while (<>) { my @fields = ...; push @lines, \@fields; }

        @{$lines[0]} is the array for the first line.
        @{$lines[1]} is the array for the second line.
        etc

Re: Slurping strings from text file and pushing to array?
by nudge (Acolyte) on Jul 02, 2010 at 11:12 UTC

    Hi Mad_Mac,

    Is it really required to do it in one step? Just because it could be done in one step does not mean it should be one in one line.

    Having a little trouble understanding what you code is actually trying to do. (Always best to assume that the person who is going to maintain your code is psychopath who knows where you lives)

    while ($line = <>) {
      my @fields = split(',', $line);
    }
    

    Are you trying to read a config file? (Your example open files called conf*.text). If so, Config::General is your friend

Re: Slurping strings from text file and pushing to array?
by Anonymous Monk on Jul 02, 2010 at 14:01 UTC
    my @AoA = map { [split q(,), $_] } <>;
    I've got lots more rope where that came from.