我需要在bash shell上执行以下代码:
mogrify -resize 800x600 *JPG
由于width和height是变量,因此我尝试了以下操作:
`mogrify -resize $widx$hit *JPG`
但是在编译中,我得到的错误是
Global symbol "$widx" requires explicit package name at getattach.pl line 131.
,这是因为编译器将$ widx视为未声明的新变量,而不是将$ wid和x分开。我尝试在反引号内插入双引号,但是代码的执行停止了,没有任何消息。
在反引号中插入变量名称以执行Shell的正确方法是什么?它们可以串联吗?
最佳答案
要将变量插入任何插值字符串(qq//
或qx
或qr//
),只需执行"this is $foo!"
就足够了:变量名(此处为$foo
)由!
分隔,不能是普通变量名的一部分。
根据Perl的命名规则,字符串的一部分可以成为名称的一部分并不是那么容易。例:
my $genes = "ACTG$insert_genes_hereACTG";
Perl认为变量名称为
$insert_genes_hereACTG
。这可以通过解决使用curl来分隔名称:
my $genes = "ACTG${insert_genes_here}ACTG";
这始终有效并且是一种灵活的解决方案
连接字符串:
my $genes = "ACTG" . $insert_genes_here . "ACTG";
对于非
qq
引号,这有点困难。一种解决方案是创建一个包含整个字符串的临时变量,然后将其内插到特殊引号中:my $command = "mogrify -resize " . $wid . "x" . $hit. " *JPG";
`$command`;
一个变体是使用
sprintf
插值:my $command = sprintf 'mogrify -resize %dx%d *JPG', $wid, $hit;
顺便说一句,可以通过不使用反引号,而使用
open
或system
(取决于您是否需要输出)来避免许多外壳插值问题。使用
open
:open my $command, "-|", "mogrify", "-resize", $wid . "x" . $hit, glob("*JPG")
or die ...;
while (<$command>) { do something }
这完全绕过了外壳程序(而不是直接
exec
),因此必须手动完成globbing。对于具有多个参数的system
,也是如此。
关于perl - 如何在反引号内正确使用perl变量名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17009469/