Хотя замена может работать, она хрупкая и ее трудно расширять и поддерживать. Я настоятельно рекомендую учиться использовать URI , URI :: QueryParam и Path :: Class (последнее не используется в этом примере, но важно и связано ).
use warnings;
use strict;
use URI;
my $file;
$file->{srv_cgi_url} = "http://s1.site.com/cgi-bin/";
my $srv_cgi_uri = URI->new( $file->{srv_cgi_url} );
my $hash = "some";
my $fname = "path.ext";
$srv_cgi_uri->path("/dl.cgi/$hash/$fname");
print $srv_cgi_uri, "\n";
__END__
http://s1.site.com/dl.cgi/some/path.ext