私が歌川です

@utgwkk が書いている

CPANに上がっているモジュールが対応しているPerlの最小バージョンの統計情報

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.010001v5.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形式で出力することにしたので、さくっとスプレッドシートに取り込むことができる。取り込んで棒グラフを出力してみたものが以下。

docs.google.com

ライブラリが対応するPerlの最小バージョンの個数の棒グラフ

考察

  • 直近1年間にリリースが行われたモジュールが対応する最小のPerlバージョンで最も多いのは 5.10
    • その次に 5.6、続いて 5.8 という順番になっている
      • 5.8 に対応しているモジュールが一番多いと思っていたので、意外だった
      • 5.6 のほうが 5.8 よりも多いのはもっと意外だった
    • 使われているPerlのバージョンの統計も見れると考察を深められる?
  • 奇数バージョンを指定しているモジュールもあるが、かなり少ない
  • 現行のPerlではどう頑張ってもインストールできないモジュールがある
    • あえてそうなっているものも、ミス? でそうなっているものもある