This may, or may not be, what you want:
#!/usr/bin/perl
use strict;
use warnings;
use File::Basename;
use File::Find::Rule;
my @files = File::Find::Rule->file()
->in( 'c:/test/');
foreach my $file ( @files ) {
my ( $old_name, $path ) =
File::Basename::fileparse( $file );
my $new_name = $old_name;
$new_name =~ s/^ABC/ABCD/;
$new_name =~ s/^XYZ/XYZD/;
next if $new_name eq $old_name;
rename( $path . $old_name, $path . $new_name )
or die "Renaming $old_name to $new_name: $!";
# or copy, as per your update
# require File::Copy;
# File::Copy::copy( $path . $old_name, $path . $new_name )
# or die "Renaming $old_name to $new_name: $!";
}