CPANに上がっているモジュールが対応しているPerlの最小バージョンの傾向が知りたくなったので、調査することにした。直感では、最低でもPerl 5.8に対応しているモジュールが最も多いと思っていた。
情報を取得する
metacpanにはAPIがある*1ので、これを叩いて情報を取得する。
以下のコマンドで、この記事を書き始めた日までの1年間 (2020/5/4 - 2021/5/4) のリリースのうち、最新バージョンのリリースについて検索した。
$ curl -XPOST https://fastapi.metacpan.org/v1/release/_search -d @query.json > result.json
query.json
にはこういうクエリを書いた。Elasticsearchのクエリは普段あまり手書きしないのでちょっと苦労した。
{ "query": { "bool": { "must": [ { "term": { "status": "latest" } }, { "range": { "date": { "gte": "2020-05-04T00:00:00", "lt": "2021-05-04T00:00:00" } } } ] } }, "sort": [ { "date": "asc" } ], "size": 5000 }
2020/5/4 から 2021/5/4 までの間のリリースが3949件見つかったので、これらについて分析する。
Perlの最小バージョンを取得する
以下の jq
コマンドで、各モジュールが対応しているPerlの最小バージョンを列挙できる*2。
バージョンが指定されていない場合は null
が返るので // empty
で除外している。
$ jq -r '.hits.hits[]._source.metadata.prereqs.runtime.requires.perl // empty' result.json
3949個のモジュールのうち、Perlの最小バージョンが指定されているものは2695個あった。
バージョンの表記を正規化する
めでたく2695個のモジュールが対応しているPerlの最小バージョンを抽出することができたが、現状では 5.010001
や v5.10.1
といった表記が混在しており、扱いづらい。
version
モジュールを使うことで、こういったバージョン表記をパース・正規化できる。metacpanでも使われている*3。
バージョン表記を正規化してパッチバージョンを落とした上で、辞書順ではなくバージョン順に並べ替えて、個数をTSV形式で出力する。
use strict; use warnings; use feature 'say'; use version; use List::UtilsBy qw(count_by sort_by); my @versions; while (my $line = <>) { chomp $line; my $version = version->new($line); my $normalized = $version->normal; # パッチバージョンを落とす $normalized =~ s/\.[0-9]+$//; push @versions, $normalized; } my %count_of_version = count_by { $_ } @versions; for my $version (sort_by { version->new($_) } keys %count_of_version) { say join "\t", $version, $count_of_version{$version}; }
バージョン指定にミスっているのか Perl 5.100 を要求しているモジュールもあった。Perl 7を要求しているモジュールもあったけど Acme::Postmodern::Perl というAcmeモジュールなので想定した記述のようだった。CPAN Testers Reportが見たことない色合いになっていて面白い*4。
スプレッドシートに取り込む
TSV形式で出力することにしたので、さくっとスプレッドシートに取り込むことができる。取り込んで棒グラフを出力してみたものが以下。
考察
- 直近1年間にリリースが行われたモジュールが対応する最小のPerlバージョンで最も多いのは 5.10
- その次に 5.6、続いて 5.8 という順番になっている
- 5.8 に対応しているモジュールが一番多いと思っていたので、意外だった
- 5.6 のほうが 5.8 よりも多いのはもっと意外だった
- 使われているPerlのバージョンの統計も見れると考察を深められる?
- その次に 5.6、続いて 5.8 という順番になっている
- 奇数バージョンを指定しているモジュールもあるが、かなり少ない
- 現行のPerlではどう頑張ってもインストールできないモジュールがある
- あえてそうなっているものも、ミス? でそうなっているものもある
*1:実体はElasticsearchのAPIエンドポイント
*2:どのフィールドにPerlの最小バージョンが入っているのかを調べるために、 JSONの所望の値にアクセスするためのキーを逆算する - 私が歌川です のコマンドを使った
*3:https://github.com/metacpan/metacpan-web/blob/4bac58040a7c04f56ceb650f284394b3135c7f9c/lib/MetaCPAN/Web/View/HTML.pm#L81-L87
*4:http://matrix.cpantesters.org/?dist=Acme-Postmodern-Perl+0.11