When I run the code you supplied (using <DATA> and putting the input file contents in the __DATA__ section) it generates:
Name "main::OUTPUT" used only once: possible typo at ... .
missing E:/qdepot_automation/addfiles.txt
Unrecognized escape \q passed through in regex; marked by <-- HERE in
+m/E:\q <-- HERE depot_automation/ at ... .
missing E:/qdepot_automation/AMSS/products/build/textfiles.txt
which is different than the result you report. Your reported result is obtained by not using strictures! If you actually used strictures as you are pretending to you'd have been further on toward an answer to your problem: you are using \ instead of / in your match string. You should probably also meta quote the match string in case a . or other interesting character is part of the path you are matching. Consider:
use strict;
use warnings;
my $client_root = "E:/qdepot_automation";
my $perforce_root_dir = "//depot/code";
my $line;
while ($line = <DATA>) {
if ($line =~ /missing/) {
$line =~ s/\\/\//g;
$line =~ s/\Q$client_root\E/$perforce_root_dir/g;
print "$line\n";
}
}
__DATA__
missing E:\qdepot_automation\addfiles.txt
same E:\qdepot_automation\AMSS\products\build\ms\files.data
same E:\qdepot_automation\AMSS\products\build\ms\build.cmd
missing E:\qdepot_automation\AMSS\products\build\textfiles.txt
same E:\qdepot_automation\AMSS\products\build\ms\lib.min
prints:
missing //depot/code/addfiles.txt
missing //depot/code/AMSS/products/build/textfiles.txt
True laziness is hard work