You are correct that code should handle the case of, for instance, file names with spaces. However, in the example given, where the Perl interpreter is being invoked on the Windows cmd.exe command line along with a script name and command line parameters, it is cmd.exe that is handling the command line arguments and passing them to Perl. No amount of defensive programming in one's script would prevent a file name with space that does not have double quotes around it from being interpreted as two different elements of what becomes @ARGV.