2012-08-03 6 views
-3

변수 (예 : <% TPL name=userName %>)와 기능 (예 : <% TPL func=time param=now %> 또는 <% TPL func=rand %>)의 두 가지 유형의 매크로를 사용하여 간단한 템플릿 시스템을 작성해야합니다.간단한 Perl 템플릿 시스템에서 템플릿 컴파일

모두 괜찮습니다.하지만 템플릿을 추가해야합니다. 가변 매크로를 Perl 변수 (<% TPL name=userName %> ~ $userName 또는 $vars->{userName})로 대체하고 "Some text $rand->() blah blah" 또는 "Some text $func->{time}->('now') and blah blah blah"으로 기능을 변경하려고합니다.

나는 변수를 만들어 :

my $tpl = eval 'sub { my $vars = shift; "Hello, $vars-{userName}!" }'; 
return $tpl->({ userName => 'John' }); 

하지만 기능을 수행하는 방법을 모르겠어요. 이 코드는 작동하지 않습니다.

my $tpl = eval 'sub { my $func = shift; "Today is $func->{time}->('day')" }'; 
return $tpl->({ time => \&_time }); 

어떻게 작동합니까?

P.S. 당신은 문자열 내부에서 함수를 호출 할 수 없기 때문에 나는이 작동하지 않는 다른 템플릿 시스템 (TT, HTML :: 템플릿 또는 다른)

+4

을 고체 템플릿의 번호와 Perl에서 사용할 수있는 옵션, 또 다른 옵션을 작성하면 더 이상의 정당성을 사용할 수 있습니다. 기존의 대안을 고려해야하는 또 다른 이유는 현재 실행중인 과제입니다. –

+1

CPAN 모듈을 사용하지 않는다면 구현 방법을 살펴보십시오. –

+0

템플릿 시스템을 만드는 것은 어렵습니다. 왜 너 자신을 만들려고하는거야? –

답변

1

결정적인 부분은

"Today is $func->{time}->('day')" 

입니다 필요하지 않습니다/코드 표를 삽입 할 수 없습니다. 다음과 같은 솔루션을 선택할 수 있습니다 : 당신이 대신 익명 서브의 eval, 또는 closure을 사용하기 때문에

"Today is " . $func->{time}->('day'); 

"Today is @{[$func->{time}->('day')]}"; 

my $today = $func->{time}->('day'); 
"Today is $today"; 

귀하의 코드는 어쨌든 아픈입니다! 당신은 쓸 수

my $tpl = sub { 
    my ($vars) = @_; 
    return "Hello, $vars->{userName}!"; 
}; 
return $tpl->({ userName => 'John' }); 

my $tpl = sub { 
    my ($func) = @_; 
    return "Today is $func->{time}->('day')"; 
}; 
return $tpl->({ time => \&_time }); 

힌트 : 같은 템플릿 시스템을 구축 할 때, /e 옵션은 정말 도움이 될 수 있습니다

$template =~ s{<% func=(\w+) param=(\w+) %>}{join(' ',$hash->{$1}->($2))}e;