簡體   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