use strict; my %object; open IN, '<'.pop or die "can't open data: $!\n"; until( =~ /^object\s*\{/) {}; #skip ahead to the body of the first object{} my($id, $origin, $dims); while() { SWITCH: { /id "(.+)"/ && do { $id = $1; last SWITCH; }; /origin \{ (\d+) (\d+) \}/ && do { $origin = "$1,$2"; last SWITCH; }; /dimensions \{ (\d+) (\d+) \}/ && do { $dims = "$1,$2"; last SWITCH; }; (/^object\s*\{/ || eof(IN)) && do { $object{$id}{'origin'} = $origin; $object{$id}{'dims'} = $dims; }; # default: on to the next line }#SWITCH } foreach my $id (keys %object) { print "$id: "; foreach my $attr (keys %{$object{$id}} ) { print "$attr = $object{$id}{$attr} "; } print "\n"; }