perl - 使用带空格的变量 Perl

标签 perl variables whitespace montage

我目前正在做一个项目,但我遇到了一个大问题。我有一些名字中有空格的图片,我想做一个蒙太奇。问题是我不能重命名我的图片,我的代码是这样的:

$pic1 = qq(picture one.png);
$pic2 = qq(picture two.png);

my $cmd = "C:\...\montage.exe $pic1 $pic2 output.png";

system($cmd);

但由于空格,montage.exe 不起作用。如何在不重命名所有图片的情况下执行我的代码?

非常感谢您的回答!

最佳答案

您可以在传递给系统的字符串中正确引用文件名,如@Borodin 在他的回答中所示。类似于:system("montage.exe '$pic1' '$pic2'")

然而,更可靠和更安全的解决方案是将参数作为系统调用中的额外参数传递给 montage.exe:

system('montage.exe', $pic2, $pic2, 'output.png')

现在您不必担心嵌套正确的引号,或担心包含意外字符的文件。这不仅是更简单的代码,而且它避免了恶意注入(inject)问题,如果这些文件名来自受污染的源。有人可以输入 | rm *,但您的系统调用不会为您删除所有文件。

此外,在现实生活中,您可能不会为每个文件名设置一个单独的标量变量。你会把它们放在一个数组中。这使您的系统调用更加容易:

system('montage.exe', @filenames, 'output.png')

这不仅 super 简单,而且避免了命令行太长的陷阱。如果您的文件名有很好的长路径(可能是 50-100 个字符),Windows 命令行将在大约 100 个文件后超过最大命令长度。通过 system() 而不是在一个大字符串中传递参数避免了这一限制。

关于perl - 使用带空格的变量 Perl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50335653/

相关文章:

perl - 如何将变量保持在所有子例程的范围内

perl - 如何使用recursive_update

perl - 有哪些 RAD 工具可用于在 Perl 中构建 GUI?

c++ - 你如何在 C++ 中将指数与变量一起使用?

C++逐行从文件(包含空格)中读取数据

Unicode 字符串上的正则表达式是按调试器的预期解释的,而不是按程序的预期解释的

regex - 使用 Dgraph Go 客户端 QueryWithVars 时使用变量进行 Dgraph 正则表达式查询

node.js - Node Express MongoDB Native Driver — 在哪里打开数据库连接?

whitespace - XTEXT:控制何时允许空格

svn - CVS 和 Subversion 可以设置为忽略合并中的空格吗?