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

标签 perl variables backticks

我需要在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//qxqr//),只需执行"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;



顺便说一句,可以通过不使用反引号,而使用opensystem(取决于您是否需要输出)来避免许多外壳插值问题。

使用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/

相关文章:

Perl,LWP "certificate verify failed"与 paypal.com

c++ - 声明为 Node *&ptr = root->mRight 的变量

variables - Makefile 规则使用自动变量 $^ 无依赖

java - 变量初始化

perl - 为什么我的 Perl 反引号提示 "sh: line 1: any: command not found"?

shell - shell 脚本中的反引号问题

linux - 每当在 linux 中使用 inode 创建新文件时,如何获取文件名以及文件的绝对路径?

perl - 将行上的成对集转换为列

bash - sh : 1: Syntax error: redirection unexpected when using backticks perl

perl - 黑白 goto &func; 有什么区别吗?和 &func;在 Perl 中?