我有一个写一个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');!
但接受它可能是最简单的方法。
答案 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。