繁体   English   中英

在空白Perl中使用变量

[英]use a variable with whitespace Perl

我目前正在做一个项目,但是有一个大问题。 我的名字中有一些带有空格的图片,我想制作一个蒙太奇。 问题是我无法重命名我的图片,并且我的代码是这样的:

$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')

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

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

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

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

或者,您可以将参数作为列表传递给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);

您需要在带空格的文件名两边加上引号。 您还需要转义反斜杠

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

在UNIX系统中,最好的方法是在多参数形式system ,因为1)它避免了调用壳,和2)这是由OS呼叫接受的格式。 在Windows中,这些都不是正确的。 生成程序的OS调用需要命令行,而system形成该命令行的尝试有时是错误的。 最安全的方法是使用Win32 :: ShellQuote

use Win32::ShellQuote qw( quote_system );

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM