use strict; use warnings; use Data::Dumper; my @AoH ; my $current_hash = {}; while (){ chomp $_; if ( $_ =~ /objet => debut$/ .. /objet => fin$/){ if ( /objet => debut$/ ){ next; } elsif ( /objet => fin$/ ){ push @AoH, $current_hash; $current_hash = {}; } else{ my ($key,$value) = split /\s+=>\s+/,$_; $current_hash->{ $key } = $value; } } else{ print "unxpected content outside tags in line: [$_]\n"; } } print Dumper \@AoH; __DATA__ objet => debut index => 1 a => "premiere valeur" z => "dernier mot" objet => fin ALIEN LINE AFTER fin objet => debut index => 77 a => "autre valeur" z => "aurai-je le dernier mot ?" objet => fin