perl是否与字符串中的TCLs expr等效

时间:2011-11-16 13:03:02

标签: 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 $myVar + 2])').removeClass('failCount');!

我宁愿不打破声明

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

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

3 个答案:

答案 0 :(得分:7)

一种方法,在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 Toolkit服务,然后你可以像这样编写你的输出

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

答案 1 :(得分:2)

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

print qq!
$('td:nth-child(n)').show();!
$('td:nth-child(@{[ $myVar + 2] })').removeClass('failCount');!

然而,将HTML和Perl混合在一起就很麻烦了。我建议使用HTML::Template这样的模板模块,它可以让你说:

 $tmpl->param(
     MYVAR => $myVar,
     OTHERVAR => ($myVar + 2),
 );

等给出了一个包含以下内容的模板:

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

答案 2 :(得分:2)

通过创建包含表达式并立即引用数组的匿名数组,有一种可怕的hacky方法。但我真的不推荐它。

#!/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

使用真正的模板系统要好得多。我推荐Template Toolkit