use strict; use warnings; use Data::Dump qw(dump); my @links = (); my $html = do { local $/; }; while ($html =~ /[Hh][Rr][Ee][Ff]\s*=\s*['"]?([^\s"'>]+)['"]?.*?>(.*?)<\s*\/\s*[Aa]\s*>/gs) { push @links, [$1, $2]; } print dump(@links), "\n"; __DATA__ bar index some text blah text < back this is some text