use strict; use Data::Dumper; my $delimiter = "|"; # delimiter for multiple tags my %data; while(my $line = ) { chomp $line; $line =~ s/^(.*?):\s*//; # remove leading number and colon, and any whitespace my $rec = {}; my $partno; for my $field ( split(/,/, $line) ) { my ($key, $value) = split(/=/, $field); if ($key eq 'partnum') { $partno = $value; } else { $rec->{$key} = $value; } } if ( defined $data{ $partno } ) { if ( $data{$partno}{'tags'} ) { $data{$partno}{'tags'} .= $delimiter . $rec->{'tags'}; } else { $data{$partno}{'tags'} = $rec->{'tags'}; } $data{$partno}{'quantity'} += $rec->{'quantity'}; unless ($data{$partno}{'description'} eq $rec->{'description'}) { warn "Multiple descriptions for $partno ! \n"; } } else { $data{ $partno } = $rec; } } print Dumper(\%data), "\n"; __DATA__ 413: partnum=2204133000,description=PRESS GAUGE,quantity=1.0000,tags=PI-412 414: partnum=2202261000,description=THERMOWELL,quantity=2.0000,tags= 415: partnum=2201176000,description=THERMOMETER,quantity=2.0000,tags= 581: partnum=2204227002,description=TEMP TRANSMITTER,quantity=1.0000,tags=TE/TT-102 582: partnum=2201176000,description=THERMOMETER,quantity=3.0000,tags=TI-100 TI-101 TI-200 576: partnum=2204133000,description=PRESS GAUGE,quantity=1.0000,tags=PI-400