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;