in reply to Troubles with simple parsing
Your code is also not very efficient in that you're looping through the contents of the file four times. You also don't need to read the whole file into a list before processing it. Finally, you can take a shortcut and instead of checking individually for each valid key (e.g. "produce", "price", etc.), you can just take whatever is before the equals sign as a key and whatever is after as the value.
open(FILE,"<$file") or die $!; # always check for the error condition! while (my $line = <FILE>) { if ($line =~ m/\[(.*)\]/) { push @art, { item => $1 }; } elsif ($line =~ m/^(\w+)\s*=\s*(.*?)\s*$/) { # the \s*'s ignore lead +ing and trailing whitespace. $art[-1]->{$1} = $2; # [-1] references the last item in the array; + i.e. what you just pushed on there } } close FILE;
-b
|
|---|