Есть ли в Perl эквивалент выражения TCL в строке? - PullRequest
2 голосов
/ 16 ноября 2011

У меня есть скрипт, который пишет html-страницу.

Большая часть содержимого исправлена, и поэтому я использую print 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 ]

7 голосов
/ 16 ноября 2011

Один из способов сделать это - шаблонирование бедняков в строках 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 Golf в стороне, если только это не простой одноразовый проект, в долгосрочной перспективе я думаю, что вы будетелучше всего посмотрев на Template Toolkit , тогда вы можете написать свой вывод как это

$template = q!
$('td:nth-child(n)').show();
$('td:nth-child([% myVar +2 %]).removeClass('failCount');!;
2 голосов
/ 16 ноября 2011

Есть ужасный хакерский способ сделать это путем создания анонимного массива, содержащего ваше выражение, и немедленной защиты массива.Но я действительно не рекомендую это.

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

2 голосов
/ 16 ноября 2011

Вы можете просто интерполировать анонимный массив, содержащий единственное выражение:

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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...