use warnings; my @data; sub numeric_idx { my $val = shift; return ord($val) - ord('A'); } while () { chomp; my ($x, $y, $v) = split /\t/; $data[numeric_idx($x)][numeric_idx($y)] = $v if defined $v; } __DATA__ A A B A 1 C A 3 C B 2 D A 2 D B 4 D C 3