#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my %data = ( l1 => ['x1', 'x2', 'x3'], l2 => ['y1', 'y2', 'y3', 'y4'], l3 => ['z1', 'z2', 'z3', 'z4', 'z5'], ); my @liste=(); for my $key (sort{ my ($x)=$a=~/(\d+)/; my ($y)=$b=~/(\d+)/; return $x <=> $y}keys(%data)) { print "LISTE: $key\n"; my @l_bak=@liste; @liste=(); if(@l_bak) { for my $val (@{$data{$key}}) { push(@liste,map{"$_-$val"}@l_bak); } } else { @liste=@{$data{$key}}; } } print Dumper(\@liste);