Perlのバージョン指定よもやま話
うたがわきき (utagawakiki@gmail.com)
自己紹介
utgwkk.icon
うたがわきき (utgwkk)
京都にいます
バージョンの話題
Perlのバージョンについておさらい
versionモジュール
use v5.10;
requires 'perl', '5.010000';
Perlのバージョン
5.32.1
X.Y.Z
semverぽい
Yが偶数: 安定バージョン
5.032001
5/032/001
versionモジュール
Perlのバージョンをパースするモジュール
正規化したり、比較したりできる
code:v.pl
use v5.10;
use version;
my $v1 = version->parse("v5.32.1");
my $v2 = version->parse(5.032001);
say $v1->numify; # => 5.032001
say $v2->normal; # => v5.32.1
say $v1 == $v2; # => 1
use v5.10; すると何が起こるのか
Perl 5.10以降でないとコンパイルエラーになる
それ以外の効果は?
code:_
% perl -MO=Deparse -e 'use v5.10; print 1;'
sub BEGIN {
require v5.10;
()
}
no feature ':all';
use feature ':5.10';
print 1;
-e syntax OK
use feature ':5.10'; って何
Perl 5.10以降で使える機能を有効にするプラグマ
say
state
switch
indirect
Foo->new() を new Foo() と書ける
':5.10' 以外もあるの
ある
パッチバージョンは無視される
引数にバージョンもしくは有効にしたい機能名を渡す
use feature 'say';
use v5.10; すると何が起こるのか (再掲)
code:_
% perl -MO=Deparse -e 'use v5.10; print 1;'
sub BEGIN {
require v5.10;
()
}
no feature ':all';
use feature ':5.10';
print 1;
-e syntax OK
新機能をぜんぶ無効にしたのち
Perl 5.10以降で使える機能を有効にする
use v5.12; 以降
5.12以降を指定すると use feature ':5.12' に加えて use strict を含むようになる
code:_
% perl -MO=Deparse -e 'use v5.12; print 1;'
sub BEGIN {
require v5.12;
()
}
use strict;
no feature ':all';
use feature ':5.12';
print 1;
-e syntax OK
-E オプション
perl コマンドに -E オプションを渡すと、そのバージョンのPerlで使える新機能をぜんぶ有効にする
実は say 以外も有効になる
-E program like -e, but enables all optional features
code:Perl 5.32.1の場合
% perl -MO=Deparse -E 'say 1'
use feature 'current_sub', 'bitwise', 'evalbytes', 'fc', 'postderef_qq', 'say', 'state', 'switch', 'unicode_strings', 'unicode_eval';
say 1;
-e syntax OK
cpanfileのバージョン指定
Minillaを使ってライブラリを作る場合はcpanfileに必要なPerlの最低バージョンを指定する code:cpanfile
requires 'perl', '5.012000';
https://gyazo.com/5223735eafc776e00d3ec10623232c7a
余談: なぜ 5.12.0 なのか
Perlの最低バージョンの傾向
https://gyazo.com/d732c52e6ab3f01a48aab5c1ce3c880c
直近で最も多いのは5.10
対応しているPerlの最低バージョンは 7
code:pm
package Acme::Postmodern::Perl 0.11;
use warnings;
use strict;
use 7;
-1;
__END__
code:_
% perl -Ilib -e 'use Acme::Postmodern::Perl;'
Perl v7.0.0 required--this is only v5.32.1, stopped at lib/Acme/Postmodern/Perl.pm line 29.
BEGIN failed--compilation aborted at lib/Acme/Postmodern/Perl.pm line 29.
Compilation failed in require at -e line 1.
BEGIN failed--compilation aborted at -e line 1.
おわりに
いろいろなバージョン指定がある
最近のCPANモジュールは5.10以降に対応している