我需要在bash
shell上执行以下代码:
mogrify -resize 800x600 *JPG
由于width和height是变量,所以我尝试过:
`mogrify -resize $widx$hit *JPG`
但是在编译中,我得到的是全局符号“$widx”在getattach.pl行131.中需要显式包名称的错误,这是因为编译器将$widx视为新的未声明变量,而不是$wid和x.
我尝试在反引号内插入双引号,但代码的执行停止,没有任何消息.
解决方法
要将变量插入任何内插字符串(无论是qq //还是qx或qr //),只需执行“this is $foo!”是足够的:变量名(这里:$foo)由!其不能是正常变量名称的一部分.
它不是那么容易,当字符串的部分可能是Perl的命名规则的名称的一部分.例:
my $genes = "ACTG$insert_genes_hereACTG";
Perl认为变量名为$insert_genes_hereACTG.这可以解决
>使用curlies分隔名称:
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;
除此之外,许多shell插值问题可以通过不使用反引号来解决,而是使用open或system(取决于是否需要输出).
随着开放:
open my $command,"-|","mogrify","-resize",$wid . "x" . $hit,glob("*JPG") or die ...; while (<$command>) { do something }
这完全绕过了shell(而且直接执行exec),所以必须手动完成globbing.对于具有多个参数的系统也是如此.