while (){ chomp; my %rec=(); while ( / ([^:]*) # any amount of non ":"'s -better as ([A-Z0-9]*)? : # followed by a colon ([^%]*) # any amount of non "%"'s %{0,1} # followed by 0 or 1 % characters /xg ){ $rec{$1}=$2; } print $rec{SMTP}, "\n"; # for example } __DATA__ SMTP:makeusbetter@domain.com%X400:c=US;a= ;p=domain ;o=domain;s=makeusbetter;%CCMAIL:makeusbetter at domain% CCMAIL:Hunter, Sandy at domain%MS:domainin/domain/sandy%SMTP:sandyh@domain.com%X400:c=US;a= ;p=domain