Как вы можете передать undef в качестве аргумента объектному методу из шаблона TT?

Template-Toolkit, кажется, хочет всегда интерполировать undef в пустую строку. Итак, такой шаблон:

Result is [% some_object.some_method (1, undef, 2) %]

или это:

Result is [% ttvar %]
          [% some_object.some_method (1, ttvar, 2) %]

производит вызов Perl, например:

some_object->some_method (1, '', 2)

когда я хочу:

some_object->some_method (1, undef, 2)

Есть ли способ передать undef вместо пустой строки?


person F5.    schedule 03.11.2009    source источник
comment
Вам нужно различать случаи пустой строки и undef, или можно просто преобразовать пустые строки в undef?   -  person    schedule 03.11.2009
comment
Да, в этом весь смысл - мне нужно оставить undef undef, а не заставлять TT менять его на пустую строку. т.е. метод Perl должен иметь возможность проверять, определен ли параметр или нет.   -  person F5.    schedule 03.11.2009


Ответы (3)


Я добавил еще один ответ, чтобы показать пример того, как EVAL_PERL работает в TT:

use Template;
use DateTime;

my $tt = Template->new( EVAL_PERL => 1 );

my $vars = { foo => 'DateTime', bar => DateTime->now, p => 'print' };

my $file = q{
    [% SET hello = 'Hello world' %]
    [% PERL %]
    print "[% hello %]\n";
    print [% foo %]->now, "\n";
    [% p %] $stash->get( 'bar' )->ymd;
    [% END %]
};

$tt->process( \$file, $vars );

Вышеприведенное выводит следующее:

Hello world
2009-11-03T15:31:50
2009-11-03

Потому что TT действует как препроцессор и создает следующий код Perl для интерпретации:

print "hello world\n";
print DateTime->now, "\n";
print $stash->get( 'bar' )->ymd;

NB. $stash в приведенной выше строке предоставляется TT и является ссылкой на объект сундука верхнего уровня.

/I3az/

person draegtun    schedule 03.11.2009
comment
Несмотря на то, что пользуюсь ТТ уже ослиные годы, я тоже раньше с ним не сталкивался! Но потом мне удалось избежать использования EVAL_PERL, и мне никогда не нужно было знать об этом ;-) Вот где я это нашел: template-toolkit.org/docs/manual/Directives.html#section_PERL - person draegtun; 04.11.2009
comment
Хотя это способ решить указанную проблему, намного лучше не использовать блоки PERL в ваших шаблонах и вместо этого найти способ решить проблему в Perl, вызывающем TT. - person castaway; 13.05.2011
comment
@castaway: Полностью согласен. Но я не думаю, что этот ответ заслуживает понижения :( - person draegtun; 15.09.2011

Как насчет использования [% PERL %]?

[% PERL %]
[% my_perl_code %]
[% END %]
person Community    schedule 03.11.2009
comment
Ах да, это должно сработать - спасибо! НО - знаете ли вы, как ссылаться на переменную шаблона в коде EVAL_PERL? Например. как использовать 'some_object', это не работает, глобальный символ $some_object требует явного имени пакета: [% PERL %] $some_object-›some_method (1, undef, 2); [% КОНЕЦ %] - person F5.; 03.11.2009
comment
Этот ответ должен предоставить информацию о том, как включить эту функцию. - person Brad Gilbert; 03.11.2009
comment
Хорошая точка зрения; вам нужно использовать EVAL_PERL при создании объекта Template: my $tt = Template-›new ({EVAL_PERL =› 1}); template-toolkit.org/docs/modules/Template.html#method_new template-toolkit.org/docs/modules/ - person F5.; 03.11.2009
comment
@F5: повторное использование шаблона var с EVAL_PERL: у вас должна быть возможность сделать это: [% PERL %]$stash->get('some_object')->some_method(1, undef, 2);[% END %] - person draegtun; 03.11.2009

Это проектное решение с Template Toolkit. На странице 50 Perl Template Toolkit "Badger book":

Template Toolkit не будет жаловаться, если встретит переменную, для которой не определено значение. Вместо этого он будет спокойно использовать пустую строку (т. е. вообще ничего) в качестве значения переменной и продолжит обработку напоминания о шаблоне.

Однако то, что вы можете сделать, это заставить TT выдавать предупреждение, когда он видит undef, используя опцию DEBUG. См. вопрос SO Может ли Perl Template Toolkit предупреждать о неопределенных значениях? для получения дополнительной информации.

/I3az/

person draegtun    schedule 03.11.2009
comment
ОК - похоже, это невозможно отключить; решение [% PERL %] кажется подходящим. - person F5.; 03.11.2009