sironekotoroの日記

Perl で楽をしたい

Mojolicious::Lite でヘルパー関数を使う & サブルーチンリファレンス

近況

こんな感じの会社生活やってます。

なんで経理のお手伝いやってるかっていうと、経理の人員が足りないってところ簿記2級所持の自分がいたから、という巡り合わせです。

会計ソフトに記帳していくだけなら経理未経験でも行けるだろうと。

(とはいえ、取得から7年くらいは経ってるのでかなり忘れてる)

3月の最終週からバックオフィスのメンバーに助けてもらいつつお仕事しております。

なお、明日月曜日からは6月の月初なので経理が大変な週です。皆さんの職場の経理マンをそっと見守りつつ、労わりましょう。

テンプレートで使える便利関数

で、3割のサーバの中で何かするってやつなのですが、テンプレートの出力を変更したり、ということをよくやっています。

そのテンプレートにはマクロ機能というのがあり、これが便利だったんですね。View専用の関数とでもいうか。

似たような機能が Mojolicious::Lite にないかなぁ、と思ったら helper という機能名で実装されていました。

helper 、聞いたことはあったのですが、その時は理解できませんでした。今なら行けそう。

Mojolicious::Lite でヘルパー関数を使う

業務に近い例を考えていたのですが、汎用性ないなぁってことで、いつもの fizzbuzz にしてみました。

#!/usr/bin/env perl
use Mojolicious::Lite;

get '/' => sub {
    my $c = shift;
    $c->stash( num => [ 1 .. 100 ] );
    $c->render( template => 'index' );
};

# ヘルパー関数の宣言
helper fizzbuzz => sub {
    my ( $self, $num ) = @_;

    if ( $num % 15 == 0 ) {
        return 'fizzbuzz';
    }
    elsif ( $num % 3 == 0 ) {
        return 'fizz';
    }
    elsif ( $num % 5 == 0 ) {
        return 'buzz';
    }
    else {
        return $num;
    }
};

app->start;
__DATA__

@@ index.html.ep
% layout 'default';
% title 'Welcome';
<h1>Welcome to the Mojolicious real-time web framework!</h1>

<% for my $n ( @{$num}) { %>
    <%= fizzbuzz($n) %><br>
<% } %>

@@ layouts/default.html.ep
<!DOCTYPE html>
<html>
  <head><title><%= title %></title></head>
  <body><%= content %></body>
</html>

以上です。

Perl入学式の講義ではテンプレートの中でIFの条件分岐を書いていましたが、ヘルパー関数にまとめることでスッキリしました。

サブルーチンリファレンス

ヘルパー関数の宣言は以下のコードです。

helper fizzbuzz => sub {
    my ( $self, $num ) = @_;
# ... 中略
}

これはサブルーチンリファレンスを使っています。

例えば、サブルーチンの例としてこんなサブルーチン作ってみます。

#!/usr/bin/env perl
use strict;
use warnings;

sub greet {
    my $name = shift;
    return "Hello, $name !\n";
}

print greet('sironekotoro');    # Hello, sironekotoro !

サブルーチンをリファレンスにすることで、スカラー変数に入れてしまうことができます。

以下はデリファレンスして引数を設定した例ですが、これはちょっと書いていて辛いですね・・・

#!/usr/bin/env perl
use strict;
use warnings;

sub greet {
    my $name = shift;
    return "Hello, $name !\n";
}

my $greet_ver = \&greet
    ; # サブルーチンをリファレンスにしてスカラー変数に格納
print &{$greet_ver}('sironekotoro');    # デリファレンスしてる

もちろん、配列リファレンスやハッシュリファレンスと同様、無名サブルーチンリファレンス を作ることができます。これはよくコードリファレンスまたはコードレフ(coderef)と呼ばれてます。

すっきり書けますね。

#!/usr/bin/env perl
use strict;
use warnings;

my $greet = sub {
    my $name = shift;
    return "Hello, $name !\n";
};

print $greet->('sironekotoro');

アロー記法で引数を設定できるとか、配列リファレンスやハッシュリファレンスと同じですね。

比較しながら考えたり書いてみると分かりやすいと思います。

この最後の書き方はほぼ、Mojolicious::Lite の helper 関数の書き方や、 view での呼び出し方に近いです。

ということで view がごちゃごちゃしてきた時にはぜひ helper 関数にチャレンジしてみてください!