in reply to Parsing multi-line records

my $recordSet = 11; open (FILE, $file) or die $!; my @list = <FILE>; close (FILE); my @datasets = (); while (my @subList = splice( @list, 0, $recordSet) ){ push (@datasets, join("\n", @subList); } undef @list;
So, now you've got your datasets in the list @datasets...

Replies are listed 'Best First'.
(Ovid) Re: Re: Parsing multi-line records
by Ovid (Cardinal) on Dec 04, 2001 at 21:44 UTC

    I think this is the best answer in the thread, but the join is a bad idea. You've already got newlines in there, so, so later someone will need to come along and do a "split /\n\n/, @datasets;". Assuming that the newlines are not needed, I would chomp them and use array references.

    my $recordSet = 11; open FILE, "< $file" or die "Cannot open $file for reading: $!"; chomp ( my @list = <FILE> ); close FILE; my @datasets = (); while (my @subList = splice( @list, 0, $recordSet) ){ push @datasets, \@subList; }

    With this, you now have an array or array refs, each containing precisely one record and no worries about adding extra newlines. Remember to always use Perl's data structures when possible (and reasonable, of course).

    Cheers,
    Ovid

    Join the Perlmonks Setiathome Group or just click on the the link and check out our stats.

      or just take it into an LDIF-like datastructure:
      my $recordSet = 11; open FILE, "< $file" or die "Cannot open $file for reading: $!"; chomp ( my @list = <FILE> ); close FILE; my @datasets = (); while (my @subList = splice( @list, 0, $recordSet) ){ my %hash = (); foreach (@subList){ my ($key, $value) = split(/\s*\:\s*/, $_, 2); if (exists $hash{$key} ){ push (@{ $hash{$key} }, $value); } else { $hash{$key} = $value; } push @datasets, \%hash; # if unique key exists, better use a Hash of Hashes # instead of array of hashes } } }