Help us understand the problem. What is going on with this article?

2019年の最先端のPerl開発ボイラープレート

Perl Advent Calendar始まりました! @AnaTofuZ ありがとうございます!
今年も元気にやっていきましょう!

さて、Perlも実はまだまだ進化しています。

今年はPerl6として開発されていた言語がRakuに名前を変えましたが、
Perl5はPerlとして今後も開発とメンテナンスが続けられていきます。

2019年にPerlを書くそこのあなた、最先端のものが必ずしも現場にマッチするとは限らないですが、最先端のものの多くは既存のものにある課題を解決しています。
どういったものをどう使って書けばよいのかなんとなく知っておくといざというときの助けになるでしょう。

前提

このへんつかっとくといいとおもいます

  • strictures
    • use strict だけでなく様々な強い制約を有効化します。 PERL_STRICTURES_EXTRA をtrueにしておけば no indirect とかもやってくれる。
  • Syntax::Keyword::Try
    • try/catch/finally あたりのsyntaxをkeyword pluginで提供してくれる。Try::Tiny などのprototype式のやり方と比較してハマりどころが少ないと思われる。
  • Function::Parameters
    • fun/method あたりのsyntaxをkeyword pluginで提供してくれる。後述のTypes::Standardと組み合わせて動的型チェックもできる。
  • Function::Return
    • Function::Parametersが引数を見るならこっちは返り値を見るぜというやつ。
  • Type::Tiny
    • ナウなヤングにバカウケな型表現メタオブジェクト。最近のPerlでのデファクトスタンダード。
  • Types::Standard
    • Type::Tinyに同梱されている基本型の定義セット。
  • Moo
    • ナウなヤングにバカウケなOOPフレームワーク。最近のPerlでのデファクトスタンダード。
  • namespace::clean
    • 外部からインポートしてきたサブルーチンをBEGINフェーズ終了時に掃除してくれる。うっかり外部から行儀悪く参照するみたいなことができなくなって便利。

詳しくはマニュアルを読みましょう

ボイラープレート

詳しいことはきっと誰かが書いてくれる!!!!

scripting

use strictures 2;
use Syntax::Keyword::Try;
use Function::Parameters;
use Function::Return;
use Types::Standard -types;
use namespace::clean;

fun main(Str $msg) {
    say "Hello, $msg";
}

main(@ARGV);

OOP

package Point;
use strictures 2;
use Moo;
use Syntax::Keyword::Try;
use Function::Parameters;
use Function::Return;
use Types::Standard -types;
use namespace::clean;

1;

package Point;
use strictures 2;
use Moo;
use Syntax::Keyword::Try;
use Function::Parameters;
use Function::Return;
use Types::Standard -types;
use Type::Tiny::Class;
use namespace::clean;

has x => (
    is  => 'ro',
    isa => Int,
);

has y => (
    is  => 'ro',
    isa => Int,
);

method distance_of((InstanceOf['Point']) $dest) :Return(InstanceOf['Point']) {
    my $distance_x = $dest->x - $self->x;
    my $distance_y = $dest->y - $self->y;
    return Point->new(x => $distance_x, y => $distance_y);
}

method as_string() :Return(Str) {
    return sprintf 'Point(%d, %d)', $self->x, $self->y;
}

1;

おまけ

Function::Parametersで (InstanceOf['Point']) と括弧でくくる必要がある件はissueが立っていましたがいまのところ直す動きではなさそうです

https://github.com/mauke/Function-Parameters/issues/36

追記: @kfly8 による解説がなされました
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away