http://www.perlmonks.org?node_id=659982


in reply to File::Copy versus cp/mv

It's pretty easy to convince them. Just insist that instead of writing fragile code that blithely ignores error returns, they check and report them properly.
my $cmd = "cp $foo $bar"; my $r = system($cmd); if ($r) { if ($? == -1) { die "failed to execute '$cmd': $!\n"; } elsif ($? & 127) { my $msg = sprintf "'$cmd' failed with signal %d, %s coredump\n", ($? & 127), ($? & 128) ? 'with' : 'without'; die $msg; } else { die "'$cmd' exited with value %d\n", $? >> 8; } }
This is based on the example code in perlfunc(1). Faced with writing all that just to get a correct error message on failure, any developer would prefer to encapsulate the code in some routine, called... oh, I don't know, perhaps copy()? Now while File::Copy's interface is not as crufty as system()'s, you still have to check for errors explicitly:
copy($foo, $bar) or die "cannot copy $foo to $bar: $!";
But that's a big improvement for any programmer who wants to be lazy but still write correct code. Others have mentioned the need to use multi-argument system(), otherwise your code will have (perhaps exploitable) bugs when passed filenames containing spaces or shell characters.