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 #### unxpected content outside tags in line: [ALIEN LINE AFTER fin] $VAR1 = [ { 'a' => '"premiere valeur"', 'index' => '1', 'z' => '"dernier mot"' }, { 'z' => '"aurai-je le dernier mot ?"', 'a' => '"autre valeur"', 'index' => '77' } ];