in reply to cp -rp src dst

why not system?
my @arguments = ("cp", "-rp", "$source_dir", "$destination_dir"); system(@arguments);
You could also use File::NCopy, which is mentioned in the directories Q and A.