in reply to Altering an array with grep & map

Problem with setting the base tag is that it has to be an absolute URL, and therefore isn't as forgiving as relative URLs to directory moves. Depending on what he wants, it may or may not work.

EDIT: The following will probably do what you want. Note that slightly more advanced processing is required to make sure that links that aren't supposed to be changed, such as absolute URLs or mailto links, are ignored.

use strict; use warnings; my $path = 'file.htm'; my @check = ('href','src'); my ($handle, $text); open($handle, $path); $text = join('', <$handle>); close($handle); my $check = '(?:' . join('|', @check) . ')'; $text =~ s/($check=")([^"]+)/$1.relative($2)/ieg; open($handle, ">$path"); print $handle $text; close($handle); sub relative { return $_[0] if length($_[0]) < 2; # Ignore empty or / +URLs return $_[0] if index($_[0],':') != -1; # Ignore email links return $_[0] if substr($_[0],0,1) eq '/'; # Ignore absolute UR +Ls if (substr($_[0],0,1) eq '.') { return $_[0] if substr($_[0],1,1) eq '.'; # Ignore URLs alread +y ../ return '.'.$_[0]; # URLs ./ change to +../ } return '../'.$_[0]; # Rest changes to .. +/ }