CPANオファリングについては、以下をご覧ください (アルファベット順)...
提供されている CL-WHO の例のテーブル部分を使用します (ローマ数字と s/background-color/color/ を差し引いて、コードを画面幅に詰め込みます!)...
ビルダー
use Builder;
my $builder = Builder->new;
my $h = $builder->block( 'Builder::XML' );
$h->table( { border => 0, cellpadding => 4 }, sub {
for ( my $i = 1; $i < 25; $i += 5 ) {
$h->tr( { align => 'right' }, sub {
for my $j (0..4) {
$h->td( { color => $j % 2 ? 'pink' : 'green' }, $i + $j );
}
});
}
});
say $builder->render;
HTML::AsSub
use HTML::AsSubs;
my $td = sub {
my $i = shift;
return map {
td( { color => $_ % 2 ? 'pink' : 'green' }, $i + $_ )
} 0..4;
};
say table( { border => 0, cellpadding => 4 },
map {
&tr( { align => 'right' }, $td->( $_ ) )
} loop( below => 25, by => 5 )
)->as_HTML;
HTML::小さい
use HTML::Tiny;
my $h = HTML::Tiny->new;
my $td = sub {
my $i = shift;
return map {
$h->td( { 'color' => $_ % 2 ? 'pink' : 'green' }, $i + $_ )
} 0..4;
};
say $h->table(
{ border => 0, cellpadding => 4 },
[
map {
$h->tr( { align => 'right' }, [ $td->( $_ ) ] )
} loop( below => 25, by => 5 )
]
);
マルカプル
use Markapl;
template 'MyTable' => sub {
table ( border => 0, cellpadding => 4 ) {
for ( my $i = 1; $i < 25; $i += 5 ) {
row ( align => 'right' ) {
for my $j ( 0.. 4 ) {
td ( color => $j % 2 ? 'pink' : 'green' ) { $i + $j }
}
}
}
}
};
print main->render( 'MyTable' );
テンプレート::宣言
package MyTemplates;
use Template::Declare::Tags;
use base 'Template::Declare';
template 'MyTable' => sub {
table {
attr { border => 0, cellpadding => 4 };
for ( my $i = 1; $i < 25; $i += 5 ) {
row {
attr { align => 'right' };
for my $j ( 0..4 ) {
cell {
attr { color => $j % 2 ? 'pink' : 'green' }
outs $i + $j;
}
}
}
}
}
};
package main;
use Template::Declare;
Template::Declare->init( roots => ['MyTemplates'] );
print Template::Declare->show( 'MyTable' );
XML::ジェネレーター
use XML::Generator;
my $x = XML::Generator->new( pretty => 2 );
my $td = sub {
my $i = shift;
return map {
$x->td( { 'color' => $_ % 2 ? 'pink' : 'green' }, $i + $_ )
} 0..4;
};
say $x->table(
{ border => 0, cellpadding => 4 },
map {
$x->tr( { align => 'right' }, $td->( $_ ) )
} loop( below => 25, by => 5 )
);
そして、以下は、HTML::AsSubs / HTML::Tiny / XML::Generator の例で「ループ」を生成するために使用できます....
sub loop {
my ( %p ) = @_;
my @list;
for ( my $i = $p{start} || 1; $i < $p{below}; $i += $p{by} ) {
push @list, $i;
}
return @list;
}