目の前に僕らの道がある

勉強会とか、技術的にはまったことのメモ

MooseX::Getoptを使ってみた

Perlスクリプトをコマンドラインから実行する際、引数をパースしてくれる便利なモジュールがあるみたいなので試してみました。

今回もしつこく、前回作ったメール送信クラスを使用してメールを送信するスクリプトを作成しました。

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

package CmdLine;
use Moose;
with 'MooseX::Getopt';

# プロパティ
has 'from' => (
    is       => 'ro',
    isa      => 'Str',
    required => 1,
);

has 'to' => (
    is       => 'ro',
    isa      => 'Str',
    required => 1,
);

has 'title' => (
    is       => 'ro',
    isa      => 'Str',
    required => 1,
);

has 'body' => (
    is       => 'ro',
    isa      => 'Str',
    required => 1,
);

has 'server' => (
    is       => 'ro',
    isa      => 'Str',
    required => 1,
);

__PACKAGE__->meta->make_immutable;
no Moose;

# main関数
sub main {
    my $self = shift;

    use MailSender;
    use Encode;

    # メールを送信します。
    my $sender = MailSender->new(
        from        => $self->from,
        to          => $self->to,
        subject     => $self->title,
        body        => $self->body,
        server      => $self->server,
    );
    $sender->mail_send();
}

1;

package main;

# main関数の実行
CmdLine->new_with_options->main();

こんな風に書くことでCmdLineクラスのインスタンス変数にコマンドライン引数を勝手に代入してくれるみたいです。
コマンドラインオプションを増やしたい時はCmdLineクラスのプロパティを新しく定義するだけです。

メイン処理はCmdLineクラスのmainメソッドに定義してあります。mainって名前がいいのかはよくわかりませんが、私は元々C言語erなのでこの方が落ち着きます。

CmdLine->new_with_options->main();でメインメソッドを呼ぶ形になっています。

コマンドラインはこんな感じ。スクリプト名はsend_mail.plとしています。

perl send_mail.pl --from "送信元アドレス" --to "宛先アドレス" --title "メールタイトル" --body "メール本文" --server "SMTPサーバ"

ちなみにへんなオプションとかを指定すると勝手にusageを表示してくれます。すばらしい。

usage: send_mail.pl [long options...]
        --body
        --to
        --from
        --title
        --server

それにしてもC言語と比べて楽でいいなあ。同じことをCで書こうとしたらコレ結構面倒くさいですよ。