#!/usr/bin/perl use warnings; use strict; use Syntax::Construct qw( // ); my %map; my $sep = '^'; my @flds; # Loop through the lines and create hashmap while (my $line = ) { chomp $line; @flds = split /\^/, $line; next if 1 == $.; $map{$flds[0]}{$flds[1]} = $flds[2]; } # Print the header line print "Name"; my %codes; undef @codes{map keys %$_, values %map}; for my $k (sort keys %codes){ print "$sep$k"; } print "\n"; # Print the table for my $k1 (sort keys %map) { print $k1; for my $k2 (sort keys %codes) { print "$sep", $map{$k1}{$k2} // q(); } print "\n"; }