#move this line up (and simplify it): #if(length($materialmapping_file) gt 0 or length($data_folder) gt 0) unless (defined $materialmapping_file and defined $data_folder) { print "Usage: $0 \n"; exit; } # Now, everything that follows can be outdented one level. #### while( ($filename = readdir(DIR))){ #if($filename =~ /\.xls$/i) { next unless $filename =~ /\.xls$/i; # everything below can be outdented my $parser = Spreadsheet::ParseExcel->new(); my $oBook = $parser->parse($data_folder.$filename); #if (defined $oBook ) { next unless defined $oBook; # everything below can be outdented ... #### my %seen; # a new global variable ... # then, whenever you 'createElement' and/or 'setAttribute', first assemble the string: #my $materialmapping_item2 = $materialmapping_table_xml->createElement("item3"); #$materialmapping_item2->setAttribute(decode('cp1252',$pr_cell_name2->{Val}),$pr2); my $entry = join',', decode('cp1252',$pr_cell_name2->{Val}),$pr2; # and create it if it doesn't already exist: if (!exists $seen{$entry}++){ my $materialmapping_item2 = $materialmapping_table_xml->createElement("item3"); $materialmapping_item2->setAttribute($entry); }