正如@Borodin 在他的回答中显示的那样,您可以在传递给系统的字符串中正确引用文件名。就像是:system("montage.exe '$pic1' '$pic2'")
但是,更可靠和更安全的解决方案是将参数作为系统调用中的额外参数传递给 montage.exe:
system('montage.exe', $pic2, $pic2, 'output.png')
现在您不必担心嵌套正确的引号,或担心文件中包含意外字符。如果这些文件名来自受污染的源,这不仅是更简单的代码,而且还避免了恶意注入问题。有人可以进入| rm *,但您的系统调用不会为您删除所有文件。
此外,在现实生活中,您可能不会为每个文件名使用单独的标量变量。你将把它们放在一个数组中。这使您的系统调用更加容易:
system('montage.exe', @filenames, 'output.png')
这不仅超级简单,而且避免了命令行太长的陷阱。如果您的文件名有很好的长路径(可能 50-100 个字符),则 Windows 命令行在大约 100 个文件后将超过最大命令长度。通过 system() 而不是一个大字符串传递参数可以避免这种限制。