# test of tTemplate

#### 制御タグのエスケープ

- $${}
- $${ }
- $$
- $${
- $$${

#### 変数展開

- 単純なdataspec: ${%print text}
- %varを省略: ${text}
- key.key: ${hash.a}
- key.index: ${tlist.0}
- key[dataspec]: ${%evalperl "1" tmp}${tlist[tmp]}

#### forループ

- before loop: ${index} ${text}
${%for text in tlist index 10}
- in loop: ${index} ${text}
${%end}
- after loop: ${index} ${text}

#### evalperl

${%evalperl "0" v} ${%evalperl "$_->{loop}=[(1..10)]"} ${%for n in loop} ${%evalperl "$a+1" v v} ${v} ${%end}

error case: ${%evalperl "$_->{loop}=[(1..10]"}

#### blockdefine,blockpaste

${%blockdefine block1}
- v=${v}
${%end}

${%evalperl "1" v }${%blockpaste block1} ${%evalperl "2" v }${%blockpaste block1} ${%evalperl "3" v }${%blockpaste block1}

#### フィルタ

- 省略: ${htmltest}
- raw: ${htmltest #raw}
- html: ${htmltest #html}
- nobr: ${htmltest #nobr}
- uri: ${htmltest #uri}

#### if-elsif-else-end

${%evalperl "1" th}

${%for v in varlist}
[${v}] | ${%if defined v } defined ${%end} | ${%if not defined v } notdefined ${%end} | ${%if length v } length ${%end} | ${%if not length v } notlength ${%end} | ${%if bool v } bool ${%end} | ${%if not v } not ${%end} | ${%if nz v } ${%evalperl "$a+0" n v} ${n} ${%end} | ${%if v > th } >${th} ${%end}
${%end}

${%for v in testif}
- [${v}] is : ${%if v==1 } first ${%elsif v==2 } second ${%elsif v==3 } third ${%else} else ${%end}
${%end}

#### ifc-elsifc-else-end

${%evalperl "1" th}

${%for v in varlist}
[${v}] | ${%ifc "defined $a" v } defined ${%end} | ${%ifc "not defined $a" v } notdefined ${%end} | ${%ifc "length $a" v } length ${%end} | ${%ifc "not length $a" v } notlength ${%end} | ${%ifc "$a" v } bool ${%end} | ${%ifc "not $a" v } not ${%end} | ${%ifc "$a!=0" v } ${%evalperl "$a+0" n v} ${n} ${%end} | ${%ifc "$a>$b" v th } >${th} ${%end}
${%end}

${%for v in testif}
- [${v}] is : ${%ifc "$a==1" v } first ${%elsifc "$a==2" v } second ${%elsifc "$a==3" v } third ${%else} else ${%end}
${%end}

#### 演算子

${%evalperl "0" v0} ${%evalperl "1" v1} ${%evalperl "2" v2} ${%evalperl "3" v3} ${%evalperl "[0,1,2,3]" va} ${%evalperl "[0,1,2,3]" $2 } ${%evalperl "{v2=>'hello',va=>[0,1,2,3]}" vh}

( a )
  $${1+(*3)} => ${ 1+(2*3)}
  $${(1+2)*3} => ${ (1+2)*3}
$
  $ は パラメータ構造体を示すデータ参照式です。$の直後にキーワードや定数を書いた場合はそれは常に$[keyword]と解釈されます。
  たとえばdefined は演算子ですが、 $defined はパラメータ参照式として扱われます。
  使用例は次の項目を参照してください。
a[b] メンバ/配列参照
a.b メンバ参照
  a[b] はexprを評価した値を使ってハッシュ/配列のメンバを参照します。
  a.b は左右の項を連結してデータ参照パスを組み立てます。
  左項はデータ参照式である必要があります。
  a.bは、項がキーワードの場合はそのキーワードを連結します。
  a.bは、項がデータ参照式の場合はそのパスを連結します。
  a.bは、項がそれ以外の値の場合はその値を連結します。
  例： パラメータが次のようになっている場合、

      	{
      		v0=>0, v1=>1, v2=>2, v3=>3,
      		va=>[0,1,2,3],
      		2=>[0,1,2,3],
      		vh=>{v2=>'hello',va=>[0,1,2,3]},
      		defined=>'yes,defined',
      	}

  ${%evalperl "0" v0} ${%evalperl "1" v1} ${%evalperl "2" v2} ${%evalperl "3" v3} ${%evalperl "[0,1,2,3]" va} ${%evalperl "[0,1,2,3]" $2 } ${%evalperl "{v2=>'hello',va=>[0,1,2,3]}" vh} ${%evalperl "'yes,defined'" $defined} 以下の式は次のように展開されます。

  $${va[2]} => ${va[2]} | # 数値で配列インデクスを指定
  $${va[-1]} => ${va[-1]} | # マイナスの添字は配列の末尾から
  $${va[v2]} => ${va[v2]} | # 別のデータ参照式の値で添字を指定
  $${vh["v2"]}=> ${vh["v2"]} | # 左項がハッシュの場合も使えます
  $${vh.v2} => ${vh.v2} | # 右項がキーワードの場合はそのキーワードを参照パスに連結します
  $${va.-1} => ${va.-1} $${va.(1+2)}=> ${va.(1+2)} | # 値を参照パスに連結: 項が参照ではない値の場合
  $${vh."v2"}=> ${vh."v2"} | # 値を参照パスに連結: 項が文字列定数の場合
  $${a.2 }=> ${va.2} | # 値を参照パスに連結: 項が数値定数の場合
  $${va.v3} => ${va.v3} | # 左項が配列だった場合、右項は数値コンテキストで解釈されます
  $${vh.(va.2)}=> ${vh.(va.2)} | 項が参照パスだった場合はパス同士をを連結します。用途は特にありませんが対称性のため。
  $${ $2.2}=> ${$2.2} | $ を使った参照パスの例
  $${ $.2.2}=> ${$.2.2} | $ を使った参照パスの例
  $${ $[2].2}=> ${$[2].2} | $ を使った参照パスの例
  $${ $defined }=> ${ $defined } | $ の直後では、予約キーワードは参照パスとして扱われます
  $${ $"defined" }=> ${ $"defined" } | $ の直後では、定数は参照パスとして扱われます
  $${ $.defined }=> エラーになります | '.' の右項は通常の式を書けるため、裸のdefinedは演算子として扱われます。

++a , --a , a++ , a--
  Cの単項インクリメント/デクリメント演算子と同じです。
  項はデータ参照式である必要があります。
  $${v=5} $${++v} $${++v} => ${v=5} ${++v} ${++v}
  $${v=5} $${--v} $${--v} => ${v=5} ${--v} ${--v}
  $${v=5} $${v++} $${v++} => ${v=5} ${v++} ${v++}
  $${v=5} $${v--} $${v--} => ${v=5} ${v--} ${v--}
a**b
  perlのべき乗演算子と同じです。
  $${2**8} => ${2**8}
!a , ~a , +a , -a
  単項演算子の論理否定、ビット否定、プラス、マイナスです。
  $${!1} $${!0} => ${!1} ${!0}
  $${~1} $${~0} => ${~1} ${~0}
  $${+1} $${+0} => ${+1} ${+0}
  $${-1} $${-0} => ${-1} ${-0}
a*b , a/b , a%b , a repeat b
  乗除、商、 文字列の反復
  $${30 *7 }=> ${ 30 * 7}
  $${30 /7 }=> ${ 30 / 7}
  $${30 %7 }=> ${ 30 % 7}
  $${30 repeat 7} => ${ 30 repeat 7}
a+b , a-b , a cat b
  加算、減算、 文字列の連結
  $${30 +7} => ${ 30 + 7}
  $${30 -7} => ${ 30 - 7}
  $${30 cat 7} => ${ 30 cat 7}
<< >>
  ビットシフト
  $${16 << 1} => ${ 16<<1 }
  $${16 >> 1} => ${ 16>>1 }
int a,defined a , length a , bool a, nz a
  int は 数値の整数部分を返します。 ex: $${int 30/7} => ${ int 30/7}
  defined は 値が未定義なら0を、そうでないなら1を返します。
  length は 値が空文字列なら0を、そうでないなら1を返します。
  bool は 値がperl的に偽なら0を、そうでないなら1を返します。
  nz は 値が数値的に0なら０を、そうでないなら1を返します。
  defined等の条件演算の例はifの項を参照して下さい。
< > <= >= lt gt le ge
  perlの比較演算子です。
== != <=> eq ne cmp
  perlの比較演算子です。
&
  ビットANDです。
  $${ 3 & 6 } => ${ 3 & 6 }
| ^
  ビット or, xor です。
  $${ 3 | 6 } => ${ 3 | 6 }
  $${ 3 ^ 6 } => ${ 3 ^ 6 }
&&
  論理ANDです。
  $${ 0 && 6 } => ${ 0 && 6 }
  $${ 1 && 6 } => ${ 1 && 6 }
|| //
  || は論理 or です。 a//b は defined($a)?$a:$b と等価です。
  $${ 0 || 6 } => ${ 0 || 6 }
  $${ 1 || 6 } => ${ 1 || 6 }
  $${ undef // 6 } => ${ undef // 6 }
  $${ 3 // 6 } => ${ 3 // 6 }
a?b:c
  三項演算子です。
  $${ 0 ? "true" : "false" } => ${ 0 ? "true" : "false" }
  $${ 1 ? "true" : "false" } => ${ 1 ? "true" : "false" }

  v | v?"true":"false" | v//"undef" | v||"false"
  --- | --- | --- | ---
  ${%for v in varlist}
  [${v}] | ${v?"true":"false"} | [${v//"undef"}] | [${v||"false"}]
  ${%end}

= **= *= /= %= += -= <<= >>= &= |= ^= &&= ||= //=
  = は代入演算子です。
  それ以外の op= のような形をしているものは a = (a op b) と等価です。
not a
  論理否定です。
a and b
  論理積です。
a or b , a xor b
  論理和と排他的論理和です。