@nqounetです。

昨日、久しぶりにmojo generate lite_appしてから簡単なプログラムを作ったのですが、とんでもないところにはまってしまったので自戒を込めて書き記します。

書こうと思ったのは、LTSVの形式で書いてあるファイルを読み込み、URLをリンクにして表示する、という単純なもの。

…だったのですが、すっかりハマってしまいました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use Mojolicious::Lite;
use Text::LTSV;

get '/' => sub {
my $self = shift;
my $p = Text::LTSV->new;
my $datafile = 'hoge.ltsv';
my $data = $p->parse_file($datafile) or die;
$self->stash(data => $data);
$self->render('index');
};

app->start;
__DATA__

@@ index.html.ep
% for my $line (@{$data}) {
<a href="<%= $line->{url} %>"><%= $line->{url} %></a>
% }

ものはこんな感じだったのですが。

何がいけなかったのかわかりますか?

$self->stash(data => $data)の部分がダメなところでした。

Mojoliciousでは、dataで渡された場合、それをバイナリのデータとしてレスポンスを返してしまいます。

なので、$dataがスカラとして出力されていました。

この時、私のガチガチに固まった私の頭は、モジュールが返している値が違うんじゃないかと思っていました。

Mojoliciousから離れて、普通に画面に表示するまで、全く気づきませんでした。

dataは禁物

バイナリデータを直接返すことはあまりないとは思いますが、必要だからあるのでしょう。

で、このような初歩的なところでハマった言い訳としては、最近、JavaScript(とかjQuery)ばかり使っていたからかな…と思っています。

JavaScriptをいじっていると好む好まないにかかわらず、やたらとdataという変数が出てきます。

イベントオブジェクトから引数を取り出すのもdataだし、HTMLから値を渡すのに使う属性もdata-*だし、jQueryのAPIを見ていても、コールバックで受け取る引数がdataになっていたり、とにかくdataだらけでした。

それで、深く考えず$datafileという変数を使ってしまったのが運の尽き。

教訓

安易にdataという変数は使うな。

名前は重要です。