#!usr/bin/perl use strict; use warnings; use Data::Dumper; use File::Find::Rule; sub process_file { my %HoH; while (<>) { chomp; my %hash; my @data = split /,/, $_; # split each line on comma my @keys = ('HOSTNAME', 'IP', 'MAC'); @hash{@keys} = @data; # hash slice $HoH{$ARGV}{$.} = \%hash; } continue { close ARGV if eof; } return \%HoH; } sub get_xml_files { my @dirs = ('.'); my $level = shift // 2; my @files = File::Find::Rule->file() ->name('*.xml') ->maxdepth($level) ->in(@dirs); return \@files; } print Dumper process_file(); print Dumper get_xml_files(); __END__ $ perl test.pl file2.txt file1.txt $VAR1 = { 'file2.txt' => { '3' => { 'HOSTNAME' => 'hostf', 'IP' => '6.6.6.6', 'MAC' => '00000C123458' }, '1' => { 'HOSTNAME' => 'hostd', 'MAC' => '00000C123456', 'IP' => '4.4.4.4' }, '2' => { 'HOSTNAME' => 'hoste', 'MAC' => '00000C123457', 'IP' => '5.5.5.5' } }, 'file1.txt' => { '1' => { 'IP' => '1.1.1.1', 'MAC' => '00000C123456', 'HOSTNAME' => 'hosta' }, '2' => { 'HOSTNAME' => 'hostb', 'MAC' => '00000C123457', 'IP' => '2.2.2.2' }, '3' => { 'HOSTNAME' => 'hostc', 'MAC' => '00000C123458', 'IP' => '3.3.3.3' } } }; $VAR1 = [ 'response.xml' ];