in reply to Re: Parsing multi-line records
in thread Parsing multi-line records

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.

Replies are listed 'Best First'.
Re: (Ovid) Re: Re: Parsing multi-line records
by strat (Canon) on Dec 04, 2001 at 22:10 UTC
    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 } } }