use strict; use warnings; use Data::Dumper; my $input = " CHANNEL123 CATEGORY123 TopCategory This is TopCategory channel's Category This is TopCategory channel's Category 0 Vod;Download Channel456 cat456 TopCategory This is TopCategory channel's Category This is TopCategory channel's Category 0 Vod;Download chann678 cat678 TopCategory This is TopCategory channel's Category This is TopCategory channel's Category 0 Vod;Download "; my %hash; while ($input =~ /((?:(?!<\/channelName>).)*)<\/channelName>\s*((?:(?!<\/name>).)*)<\/name>/gs){ $hash{$1} = $2; } print Dumper \%hash; output: ------- $VAR1 = { 'Channel456' => 'cat456', 'chann678' => 'cat678', 'CHANNEL123' => 'CATEGORY123' };