#!/usr/bin/env perl use strict; use warnings; use Data::Dumper; my %info_for; for my $file (@ARGV) { open my $FH, '<', $file or die $!; while ( my $line = <$FH> ) { my ( $cake, $price ) = split /;/, $line, 3; push @{ $info_for{$cake}{files} }, $file; push @{ $info_for{$cake}{prices} }, $price; } close $FH; } print Dumper \%info_for; exit 0; __END__ $VAR1 = { 'cake_2' => { 'files' => [ 'cakes1.txt', 'cakes2.txt', 'cakes3.txt' ], 'prices' => [ '4', '5', '4' ] }, 'cake_10' => { 'files' => [ 'cakes2.txt' ], 'prices' => [ '1' ] }, 'cake_9' => { 'files' => [ 'cakes1.txt' ], 'prices' => [ '8' ] }, 'cake_4' => { 'files' => [ 'cakes1.txt' ], 'prices' => [ '7' ] }, 'cake_6' => { 'files' => [ 'cakes2.txt' ], 'prices' => [ '9' ] }, 'cake_1' => { 'files' => [ 'cakes1.txt', 'cakes2.txt', 'cakes3.txt' ], 'prices' => [ '3', '5', '3' ] }, 'cake_3' => { 'files' => [ 'cakes1.txt', 'cakes2.txt', 'cakes3.txt' ], 'prices' => [ '9', '5', '9' ] } };