use Regexp::Common; use Cwd; use Regexp::Common::balanced; my $x = q( dfjklasjfdk jdflkasdjflkasd (1989) fdjsaflkajdf kkjdslkfjasdk dfsdlkfjdsa fdfadsfsad sajflksadjfklasd fkasdjfsadf Close df adfjlkadf dfjalkdf akdjfklasdjflkadsjfasdclose1); my $e; my @ele = ('extract','line'); foreach $e (@ele) { while ($x=~/$RE{balanced}{-begin=>"<$e"}{-end=>"<\/$e>"}{-keep}/gs) { my $begin = "$1"; $x =~ s/($begin)/&$e($1,$e)/egsi; print "$x\n"; } } sub extract { my $a = $_[0]; my $tag = $_[1]; $a =~ s/<\/$tag>/<\/$tagæ>/gi; my @a=map(!/^(".$_."<\/e>"):"\n".$_, split(/\n/,$a)); return "@a"; } sub line { my $a = $_[0]; my $tag = $_[1]; $a =~ s/<\/$tag>/<\/1$tag>/gi; my @a=map(!/^(".$_."<\/li>"):"\n".$_, split(/\n/,$a)); return "@a"; }