如何在反引号内正确使用perl变量名?

我需要在bash shell上执行以下代码
mogrify -resize 800x600 *JPG

由于width和height是变量,所以我尝试过:

`mogrify -resize $widx$hit *JPG`

但是在编译中,我得到的是全局符号“$widx”在getattach.pl行131.中需要显式包名称错误,这是因为编译器将$widx视为新的未声明变量,而不是$wid和x.

我尝试在反引号内插入双引号,但代码的执行停止,没有任何消息.

在shell执行的反引号中插入变量名称的正确方法是什么?他们可以连接吗?

解决方法

要将变量插入任何内插字符串(无论是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.对于具有多个参数的系统也是如此.

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...