perl在字符串中是否具有与TCLs expr等效的值

perl在字符串中是否具有与TCLs expr等效的值,perl,Perl,我有一个编写html页面的脚本 很多内容是固定的,所以我使用打印qq!在单个语句中输出格式良好的文本 有几行需要一个变量+2嵌入其中,所以我最终预先计算了$myVarplus2,在这一种情况下这是可以的 my $myVarPlus2 = $myVar + 2; 在TCL中,我可以在语句中使用[expre$myVar+2]。Perl有类似的概念吗 这相当于我想做的事情 print qq! $('td:nth-child(n)').show();! $('td:nth-child([expr $m

我有一个编写html页面的脚本

很多内容是固定的,所以我使用打印qq!在单个语句中输出格式良好的文本

有几行需要一个变量+2嵌入其中,所以我最终预先计算了$myVarplus2,在这一种情况下这是可以的

my $myVarPlus2 = $myVar + 2;
在TCL中,我可以在语句中使用[expre$myVar+2]。Perl有类似的概念吗

这相当于我想做的事情

print qq!
$('td:nth-child(n)').show();!
$('td:nth-child([expr $myVar + 2])').removeClass('failCount');!
我宁愿不要破坏这个声明

print qq!
$('td:nth-child(n)').show();!
$('td:nth-child(" . $myVar + 2 . qq!').removeClass('failCount');!

但接受它可能是最简单的方法。

您可以插入一个包含单个表达式的匿名arrayref:

print qq!
$('td:nth-child(n)').show();!
$('td:nth-child(@{[ $myVar + 2] })').removeClass('failCount');!
然而,像那样混合HTML和Perl是混乱的。我建议使用一个模板模块,例如,它可以让您说:

 $tmpl->param(
     MYVAR => $myVar,
     OTHERVAR => ($myVar + 2),
 );
etc给定的模板包含:

$('td:nth-child(n)').show();
$('td:nth-child(<TMPL_VAR OTHERVAR>').removeClass('failCount');
$('td:n个子项(n)').show();
$('td:n个子(').removeClass('failCount');

一种方法,可怜人的Perl字符串模板:

print qq!
\$('td:nth-child(n)').show();
\$('td:nth-child(@{[ $myVar + 2 ]}).removeClass('failCount');!
这取决于你自己的判断,你是否觉得这比打破陈述更具可读性,以及在什么时候它变得难以维持

另一种方法是printf

printf q!
$('td:nth-child(n)').show();
$('td:nth-child(%s).removeClass('failCount');!, $myVar + 2;
但抛开perl,除非这是一个简单的一次性项目,否则从长远来看,我认为最好是看一下,然后可以这样编写输出

$template = q!
$('td:nth-child(n)').show();
$('td:nth-child([% myVar +2 %]).removeClass('failCount');!;

有一种可怕的黑客方法可以通过创建一个包含表达式的匿名数组并立即延迟该数组来实现这一点,但我真的不建议这样做

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

my $my_var = 10;

my $output = "my_var is $my_var. my_var + 2 is @{[ $my_var + 2 ]}";

say $output

使用真正的模板系统要好得多。我建议使用。

Gack!小心使用双引号插值(
“…”
qq/../
)来输出jQuery代码。是的,一位同事对我说了一句话,你也可以使用标量引用:
my$output=“my_var是$my_var。my_var+2是$\($my_var+2)}
第一个示例应该是qq,否则插值将不起作用。否则…谢谢。Live and learn.qq确实!谢谢你指出这一点——我修复了第一个示例。