Template-Toolkit


断捨離

## インストール

```
$ cpanm Template
```

環境によっては、 `sudo` を

## データ構造の出力に関して。
### hash

```
$ pbpaste
use Template ;
my %hash = map{ $_ , 1 } qw( 1 2 3) ;
### 1. for my $x ( sort keys %hash ){ }
Template->new->process(\<<'EOF', { rel => \%hash } ) ;
[% FOR x IN rel.keys -%]
    [%- x _ "\t" _ rel.${x} %]
[% END -%]
EOF

$ pbpaste | perl
1       1
2       1
3       1
```

### each

```
$ pbpaste
use Template ;
my %hash = map{ $_ , 1 } qw( 1 2 3) ;
Template->new->process(\<<'EOF', { rel => \%hash } ) ;
[% FOR x IN rel -%]
    [%- x.key _ "\t" _ x.value %]
[% END -%]
EOF

```
結果は上に同じ。

### ソート

```
$ pbpaste
use Template ;
my %hash = map{ $_ , 1 } qw( 10 0002 1) ;
Template->new->process(\<<'EOF', { hash_ref => \%hash } ) ;
[%- cnt = 0 -%]
[% FOR x = hash_ref.keys.sort -%]
    [%- x _ "\t" %][% hash_ref.${x} _ "\t" %][% cnt %]
[% cnt = cnt + 1 ; END -%]
EOF

$ pbpaste | perl
0002	1	0
1	1	1
10	1	2
```
文字列ソート。

### pairs

```
$ pbpaste
use Template ;
my %hash = map{ $_ , 1 } qw( 3 2 1 ) ;
Template->new->process(\<<'EOF', { hash_ref => \%hash } ) ;
[% FOR x = hash_ref.pairs -%]
    [%- x.key _ "\t" _ x.value %]
[% END %]
EOF

$ pbpaste | perl
1	1
2	1
3	1
```

勝手にソート

### 複数配列

```
$ pbpaste
use Template ;
my @arr2 = qw( foo bar baz ) ;
my @arr3 = qw( 1 2 3 ) ;
Template->new->process(\<<'EOF', { arr2_ref => \@arr2, arr3_ref => \@arr3 } ) ;
[% FOR x = [ 0 .. arr2_ref.max ] -%]
    [%- arr2_ref.$x %] [% arr3_ref.$x %]
[% END -%]
EOF

$ pbpaste | perl
foo 1
bar 2
baz 3
```

### 2次元配列の扱い。

```
$ pbpaste
use Template ;
my @arr = (
        [ 1, 2, 3 ],
        [ 4, 5, 6 ],
        [ 7, 8, 9 ],
    ) ;

Template->new->process(\<<'EOF', { rel => \@arr } ) ;
[%- FOR x = rel -%]
    [%- FOR y = x -%]
        [%- y -%]
    [%- END -%]
[%- END %]
EOF

$ pbpaste | perl
123456789

```

### 要素へのアクセス
`@arr` 宣言までは上に同じ

```
Template->new->process(\<<'EOF', { rel => \@arr } ) ;
[%- FOR x = rel -%]
    [%- x.0 _ ":" _ x.1 _ ":" _ x.2  %]
[% END %]
EOF

$ pbpaste | perl
1:2:3
4:5:6
7:8:9
```

### slice と　join

`@arr` 宣言までは上に同じ

```
Template->new->process(\<<'EOF', { rel => \@arr } ) ;
[%- FOR x = rel -%]
    [%- first = x.slice(0,1) -%]
    [%- first.join("\t") _ ":" _ x.2 %]
[% END -%]
EOF

$ pbpaste | perl
1	2:3
4	5:6
7	8:9
```
### AoH

```
$ pbpaste
use Template ;
my @arr = (
    { count => 2, name  => 'joe'},
    { count => 1, name  => 'mike'},
    { count => 2, name  => 'lara'},
) ;

Template->new->process(\<<'EOF', { rel => \@arr } ) ;
[%- FOR x IN rel -%]
    [%- x.name _ "\t" _ x.count %]
[% END -%]
EOF

$ pbpaste | perl
joe	2
mike	1
lara	2
```

## fasta 作製。

共通部分

```
use Template ;
my $org_seq = 'a' x 1000 ;
my $name = q{test} ;
my $seq ;
my $ref = {
    name => $name,
    data => $org_seq,
} ;
Template->new->process(\<<'EOF', $ref, \$seq ) ;
```

ヒアドキュメントを使ってるので直後から続きを。
### match, for 文使用

```
>[% name %]
[% arr = data.match('.{1,50}', 1) -%]
[%- FOR i = arr -%]
    [%- i %]
[% END -%]
EOF

print $seq ;
```

### match

```
>[% name %]
[% data.match('.{1,50}', 1).join("\n") %]
EOF

print $seq ;
```

### split => replace

```
>[% name %]
[% data.replace('(.{1,50})', '$1 ').split(' ').join("\n") %]
EOF

print $seq ;
```

### chunk

```
>[% name %]
[% data.chunk(42).join("\n") %]
EOF

print $seq ;
```

## 雑多

### DATA トークン利用

`\ <<'EOF'` を `\* DATA` にする事で、
DATA トークンを利用する。

```
use Template ;
my $tt = Template->new({ EVAL_PERL    => 1}) ;
$tt->process(\*DATA, ) ;

# something code ;

__DATA__
DATA token

```

### chunk の実用

```
$ pbpaste
use Template ;
Template->new->process(
    \'[% data.chunk(-3).join(",") _ "\n" %]',
    { data => 10000000 }
) ;

$ pbpaste | perl
10,000,000
```

### strftime

```
$ pbpaste
use Template ;
Template->new->process(\<<'EOF',) ;
[% USE date(format = '%Y-%m-%d %H:%M:%S') -%]
[%- date.format %]
EOF

$ pbpaste | perl
2010-10-26 16:56:31
```

### EVAL PERL

```
use Template ;
my $tt = Template->new({ EVAL_PERL    => 1}) ;
$tt->process(\<<'EOF', ) ;
[%- PERL -%]
open my $fh , 'something.txt' or die ;
my @line = <$fh> ;
close $fh ;
print @line  ;
[%- END -%]
EOF

```