使用带有空格Perl的变量

时间:2018-05-14 17:11:13

标签: 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无法正常工作。如何在不重命名所有图片的情况下执行代码?

非常感谢您的回答!

4 个答案:

答案 0 :(得分:8)

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

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

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

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

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

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

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

答案 1 :(得分:5)

或者,您可以将参数作为列表传递给montage.exe(而不是将它们全部连接成一个字符串):

use strict;
use warnings;

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

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

system(@cmd);

答案 2 :(得分:4)

您需要在包含空格的文件名周围加上引号。你还需要逃避反斜杠

password_verify()

答案 3 :(得分:2)

在unix系统中,最好的方法是system的多参数形式,因为1)它避免调用shell,2)它是OS调用接受的格式。这些都不适用于Windows。产生程序的OS调用需要一个命令行,并且system尝试形成此命令行有时是不正确的。最安全的方法是使用Win32::ShellQuote

use Win32::ShellQuote qw( quote_system );

system quote_system("C:\\...\\montage.exe", $pic1, $pic2, "output.png");