2009-11-03 3 views
2

Template-Toolkit은 빈 문자열에 항상 undef를 삽입하려고합니다. 내가 원하는 것은시TT 템플릿에서 객체 메소드의 인수로 undef를 전달할 수 있습니까?

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

: 그래서 이런 템플릿 :

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, undef, 2) 

빈 문자열 대신 undef를 전달할 방법이 있습니까?

+0

당신이 빈 문자열 및 미확정의 경우를 구별 할 필요하거나 그냥 undef''에 빈 문자열을 변환에 OK입니다합니까? –

+0

예, 그게 전부입니다 - 나는 undef를 undef로 유지해야하고, TT는 빈 문자열로 바꾸지 않아야합니다. 나는. perl 메소드는 매개 변수가 정의되었는지 여부를 점검 할 수 있어야합니다. –

답변

3

I3az :

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 코드를 사용하여 해석합니다.

NB. 위의 $ stash는 TT에 의해 제공되며 최상위 stash 객체에 대한 참조입니다.

/I3az/

+0

우수, 감사합니다. TT $ 은닉에 대해 몰랐다 –

+1

당나귀 년 동안 TT를 사용 했음에도 불구하고 나는 어느 쪽이든 전에 그걸 보지 못했다! 하지만 EVAL_PERL을 사용하지 않으므로 알 필요가 없습니다 .-) 여기에 제가 발견되었습니다 : http://template-toolkit.org/docs/manual/Directives.html#section_PERL – draegtun

+0

이것이 명시된 문제를 해결하기 위해 템플릿에서 PERL 블록을 사용하는 것을 피하는 것이 훨씬 더 좋습니다 *. 대신 Perl이 TT를 호출 할 때 문제를 해결할 수있는 방법을 찾으십시오. – castaway

3

사용 방법은 [% PERL %]일까요?

[% PERL %] 
[% my_perl_code %] 
[% END %] 
+0

아, 그래, 작동합니다 - 고마워요! 하지만 EVAL_PERL 코드에서 템플릿 변수를 참조하는 방법을 알고 있습니까? 예 : 'some_object'를 사용하는 방법, "global symbol"$ some_object "명시 적 패키지 이름이 필요합니다": [% PERL %] $ some_object-> some_method (1, undef, 2); [% END %] –

+0

이 대답은이 기능을 켜는 방법에 대한 정보를 제공해야합니다. –

+0

좋은 지적; Template 객체를 만들 때 EVAL_PERL을 사용해야합니다. my $ tt = Template-> new ({EVAL_PERL => 1}); http://template-toolkit.org/docs/modules/Template.html#method_new http://template-toolkit.org/docs/modules/Template.html#section_EVAL_PERL –

2

이것은 디자인 결정 Template Toolkit입니다. Perl Template Toolkit "Badger book"의 50 페이지부터 :

템플릿 툴킷은 값이 정의되지 않은 변수를 발견하면 불평하지 않습니다. 대신 변수의 값에 대해 빈 문자열 (즉, 아무 것도 사용하지 않음)을 조용히 사용하고 템플릿의 미리 알림을 계속 처리합니다.

그러나 DEBUG 옵션을 사용하여 undef가 표시되면 경고 메시지를 표시하도록 TT를 설정하십시오. 자세한 내용은 SO 질문 Can Perl’s Template Toolkit warn on undefined values?을 참조하십시오.

/I가 EVAL_PERL이 TT에서 작동하는 방식의 예를 보여 다른 대답을 추가 한/

+0

OK - 그걸 끄려면; [% PERL %] 해결책은 갈 길입니다. –

관련 문제