Data::Section::Simpleで__DATA__をカジュアルに使おう!

nqounet
2011-12-24

初めまして、@nqounetです。
2011年はYAPC::ASIAデビュー(参加という意味で)したので、アドベントカレンダーもデビューしたいと思います。

そんな新人の私でもカジュアルに使えそうな Data::Section::Simple を紹介します。

__DATA__

「ヒアドキュメント」って知ってますよね?

my $html = <<"EOM";
<html>
<head><title>タイトル</title></head>
<body>ボディ</body>
</html>
EOM

こんなヤツです。
古いCGIファイルを見るとよくありますよね?

でも、ヒアドキュメントを使っているコードが見難いと思ったことはありませんか?
思いますよね。
そんな時には「__DATA__」を使うと簡単にコードが見やすくなります。

#!/usr/local/bin/perl
use utf8;
use 5.008001;
use strict;
use warnings;
use CGI::Simple;
use Encode;

my $q = CGI::Simple->new;
my $html = do { local $/; <DATA> };

print $q->header(
  -type    => 'text/html',
  -charset => 'utf8',
);
print encode_utf8( $html );

__DATA__
<html>
<head><title>タイトル</title></head>
<body>ボディ</body>
</html>

カジュアルにPerlを使うときの基本は、スクリプトはutf8で書いて、ファイルの2行目くらいに「use utf8;」を書いておきましょう。
もちろんですが、「use strict;」や「use warnings;」も忘れずに。
出力する時は「encode_utf8」が必要ですよ。

ヒアドキュメントを沢山使っている場合はどうするか、ですって?
ご安心ください。
そんな時に便利なモジュールが「Data::Section::Simple」です。

Data::Section::Simple

Data::Section::Simple を使うと、ヒアドキュメントを沢山使っている場合でも「__DATA__」を使ってコードを見やすく出来ます。

#!/usr/local/bin/perl
use utf8;
use 5.008001;
use strict;
use warnings;
use CGI::Simple;
use Data::Section::Simple qw(get_data_section);
use Encode;

my $q = CGI::Simple->new;
my $header = get_data_section('header.html');
my $body   = 'ボディ';
my $footer = get_data_section('footer.html');
my $html = join "", $header, $body, $footer;

print $q->header(
  -type    => 'text/html',
  -charset => 'utf8',
);
print encode_utf8( $html );

__DATA__
@@ header.html
<html>
<head><title>タイトル</title></head>
<body>

@@ footer.html
</body>
</html>

いやー、便利ですよね〜。

え?
ヒアドキュメントの中に変数を使っているから動かせない、ですって?
ご安心ください。
そんな時はカジュアルにCPANを使って探しましょう。

Text::MicroTemplate::DataSection

Text::MicroTemplate::DataSection を使うと、さらにカジュアルに「__DATA__」を使える感じです。
このモジュールは、テンプレート機能(Text::MicroTemplate)とData::Section::Simpleを組み合わせて、簡単に使えるようにしたモジュールです。

#!/usr/local/bin/perl
use utf8;
use 5.008001;
use strict;
use warnings;
use CGI::Simple;
use Text::MicroTemplate::DataSection qw(render_mt);
use Encode;

my $q = CGI::Simple->new;
my $html = render_mt('index.mt', {
  title => 'タイトル',
  body  => 'ボディ',
});

print $q->header(
  -type    => 'text/html',
  -charset => 'utf8',
);
print encode_utf8( $html );

__DATA__
@@ index.mt
<html>
<head><title><?= $_[0]->{title} ?></title></head>
<body><?= $_[0]->{body} ?></body>
</html>

いやー、簡単ですよね〜。

は?
使うモジュールがたくさんあって面倒、ですって?
ご安心ください。
そんな時こそカジュアルにCPANを使って探しましょう。

ウェブ・アプリケーション・フレームワーク

本格的なウェブ・アプリケーション・フレームワークでなくても、例えばMojolicious::Liteのような小さなフレームワークを使うと、useするモジュールの数が劇的に減って、かつ「__DATA__」も一層カジュアルに使えます。

#!/usr/local/bin/perl
use utf8;
use Mojolicious::Lite;

get '/' => sub {
  $_[0]->render(
    template => 'index',
    title    => 'タイトル',
    body     => 'ボディ',
  );
};

app->start;

__DATA__
@@ index.html.ep
<html>
<head><title><%= $title %></title></head>
<body><%= $body %></body>
</html>

いやー、シンプルですね〜。

気がつけば、ものすごくカジュアルにPerlが使えるようになりました。
カジュアルですが、流行りのフレームワークは自動的にstrictな環境になりますので、見た目以上にフォーマルですよ。
こんな感じで、どんどんカジュアルにPerlを使いましょう。
次は、risouさんです。