#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my %hash; while (<>) { my @items = split /\|/; $hash{ $items[3] }{ $items[2] } = [ @items[0, 1, 4 .. $#items] ]; } print Dumper \%hash;