perl コマンドでバージョンを確認する方法

はい、承知いたしました。Perlコマンドでバージョンを確認する方法について、詳細な説明を含む約5000語の記事を作成します。


Perlコマンドによるバージョン確認: 必須知識とその詳細

はじめに

プログラミング言語Perlを使用する上で、現在インストールされているPerlの正確なバージョンを把握することは、多くの状況で非常に重要となります。スクリプトの互換性確認、特定の機能の利用可否判断、セキュリティパッチの適用状況確認、デバッグ情報の提供、あるいは開発環境の統一など、バージョン情報は開発者にとって欠かせない基本的な情報です。

Perlのバージョン確認は、コマンドラインから非常に簡単に行うことができます。本記事では、その基本的なコマンドから始まり、出力される情報の詳細な読み方、なぜバージョン確認が重要なのか、歴史的なバージョン情報、複数のPerlバージョンを管理する方法、モジュールのバージョン確認方法、そしてより詳細なビルド設定の確認方法に至るまで、Perlのバージョンに関するあらゆる側面を網羅的に解説します。

この記事を通じて、あなたは単にバージョン番号を知るだけでなく、その情報が持つ意味を深く理解し、Perl開発や運用における様々な課題に対応できるようになるでしょう。

Perlのバージョンを確認する最も基本的なコマンド

Perlのバージョンを確認する最も一般的かつ簡単な方法は、コマンドラインまたはターミナルエミュレータを開き、以下のコマンドを実行することです。

bash
perl -v

または、より記述的なオプションとして --version も使用できます。

bash
perl --version

これらのコマンドは全く同じ情報を提供します。実行すると、インストールされているPerlのバージョン情報を含む数行のテキストが出力されます。

例えば、一般的なLinux環境で実行した場合、以下のような出力が得られることがあります(バージョンやシステム環境によって出力内容は異なります)。

“`
This is perl 5, version 34, subversion 0 (v5.34.0)
built for x86_64-linux-thread-multi

Copyright 1987-2021, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, Version 1 or later.

For more information about Perl, see the perl documentation.

Before reporting bugs, please run
perl -V
and read the perlbug document. See perl -h for more help.
“`

この出力には、Perlのバージョン番号だけでなく、ビルドされたアーキテクチャや著作権情報、ライセンスに関する記述などが含まれています。しかし、これらはあくまで要約された情報です。この出力の各部分が何を意味するのかを、次のセクションで詳しく見ていきましょう。

perl -v 出力の詳細な解析

perl -v コマンドから得られる出力は、一見シンプルに見えますが、Perlのビルドに関する重要な情報をいくつか含んでいます。それぞれの行が何を意味するのか、具体的に解説します。

1行目: バージョン番号とパッチレベル

This is perl 5, version 34, subversion 0 (v5.34.0)

  • This is perl 5: これは、あなたが使用しているPerlが、現在広く普及しているメジャーバージョンであるPerl 5ファミリーに属していることを示しています。Perl 5は、1994年にリリースされて以来、様々な改良が加えられながら、現代のPerlの基盤となっています。かつて存在したPerl 1~4や、近年Rakuとして再出発したPerl 6(旧称)とは異なります。
  • version 34: これはPerlのマイナーバージョン番号です。Perl 5のリリースは、概ね 5.minor.patch の形式で表されます。この例では 34 がマイナーバージョンです。Perl 5.6以降、偶数のマイナーバージョン(例: 5.14, 5.16, 5.18, …, 5.34, 5.36)は安定版リリース、奇数のマイナーバージョン(例: 5.15, 5.17, 5.19, …, 5.35, 5.37)は開発版リリースという慣習があります(ただし、これは絶対的な規則ではなく、歴史的に例外もあります)。開発版は新しい機能や実験的な変更が含まれることが多いですが、本番環境には安定版を使用するのが一般的です。
  • subversion 0: これはパッチレベル(またはマイクロバージョン)です。同じメジャーバージョン、マイナーバージョン内で、バグ修正やセキュリティアップデートなどが適用されるたびにこの番号が増えます。0 は、そのマイナーバージョンの最初のリリース、つまり v5.34.0 であることを意味します。後のパッチリリースでは v5.34.1, v5.34.2 のようにこの番号が増えていきます。セキュリティ上の理由やバグ回避のために、常に最新のパッチレベルを使用することが推奨されます。
  • (v5.34.0): これは、そのPerlビルドの正式名称であり、VCS(Version Control System、通常はGit)タグに対応する形式です。v プレフィックスはバージョンタグであることを示します。この形式は、特に特定のバージョンを指し示す際や、バージョン管理システムからコードを取得する際に便利です。

2行目: ビルドされた環境

built for x86_64-linux-thread-multi

  • built for: このPerlインタプリタがどのシステム構成(アーキテクチャ、OS、その他のビルド時のオプション)向けにビルドされたかを示します。
  • x86_64: これはCPUアーキテクチャです。この例では、64ビット版のIntelまたはAMDプロセッサ(x86-64)向けにビルドされていることを示します。他の一般的な値としては i386, armv7l, aarch64 などがあります。
  • linux: これはオペレーティングシステムの種類です。この例ではLinux上でビルドされています。他の一般的な値としては darwin (macOS), MSWin32 (Windows), freebsd, aix などがあります。
  • thread-multi: これは、このPerlビルドがスレッドをサポートしているかを示します。thread-multi は、Perlがスレッドモジュールやスレッドベースの並列処理をサポートするようにビルドされていることを意味します。スレッドを使用しない場合は thread-uni (または単にアーキテクチャとOSのみ) となっていることがあります。多くの現代的なPerlアプリケーションやモジュールはスレッドサポートを前提としているため、通常は thread-multi なビルドが望ましいです。

その他の情報

出力には、著作権情報、ライセンス情報(通常Artistic LicenseとGNU GPLのデュアルライセンス)、そしてさらに詳細な情報を得るための perl -V コマンドへの参照、ヘルプを見るための perl -h コマンドへの参照、バグ報告に関するドキュメントへの参照などが含まれます。これらの情報は、Perlの利用や貢献に関する基本的なガイドラインを提供しています。

特に重要なのは、「Before reporting bugs, please run perl -V」という指示です。これは、問題が発生した場合、Perlのビルドに関する詳細な情報(perl -V の出力)がバグ報告に不可欠であることを示しています。この perl -V については後ほど詳しく解説します。

なぜPerlのバージョン確認が重要なのか?

Perlのバージョン確認は、単なる形式的な手順ではなく、実際の問題解決や開発効率向上に直結する重要な行為です。以下に、バージョン確認がなぜ重要なのか、いくつかの理由を挙げます。

  1. 機能の利用可能性: Perlは活発に開発されており、新しいバージョンでは新しい機能が追加されたり、既存の機能が変更・廃止されたりします。特定のPerlスクリプトやモジュールが、新しい構文(例: say 関数、否定ルックバック、署名付きサブルーチンなど)や組み込み関数、正規表現機能などに依存している場合、それらの機能が利用可能なPerlバージョンで実行する必要があります。古いバージョンではこれらの機能がサポートされていないため、エラーが発生したり、期待通りに動作しなかったりします。

    • 例: say 関数はPerl 5.10で導入されました。それより古いバージョンでは print を使う必要があります。
    • 例: 署名付きサブルーチンパラメータはPerl 5.20で導入されました。
  2. バグ修正とパフォーマンス改善: 新しいバージョンには、以前のバージョンで発見されたバグに対する修正が含まれています。これらのバグは、特定の条件下でプログラムのクラッシュ、不正な動作、セキュリティ脆弱性などを引き起こす可能性があります。また、インタプリタの実行速度やメモリ管理に関するパフォーマンス改善も、新しいバージョンでしばしば行われます。最新の安定版やその最新パッチレベルを使用することは、これらのメリットを享受し、問題を回避するために推奨されます。

  3. セキュリティ: 古いPerlバージョンには、既知のセキュリティ脆弱性が存在する可能性があります。これらの脆弱性は、攻撃者によってシステムの侵害やデータ漏洩に悪用される可能性があります。Perl開発チームは、発見された脆弱性に対してセキュリティパッチをリリースし、新しいパッチレベルやマイナーバージョンにそれらを組み込みます。定期的にバージョンを確認し、必要であればアップデートを行うことは、セキュリティリスクを低減するために不可欠です。

  4. モジュールの互換性 (CPAN): Perlエコシステムの大きな強みは、CPAN (Comprehensive Perl Archive Network) を通じて入手できる豊富なサードパーティ製モジュールです。しかし、これらのモジュールは特定のPerlバージョンで動作することを前提に開発されていることがあります。新しいモジュールは最新のPerl機能を活用していることが多く、古いPerlバージョンではインストールできなかったり、依存関係が解決できなかったり、実行時にエラーが発生したりします。逆に、非常に古いモジュールが新しいPerlバージョンで非推奨となった機能を利用している場合、警告が出たり、動作しなくなったりすることもあります。モジュールをインストールまたは実行する前にPerlバージョンを確認することは、互換性の問題を未然に防ぐために重要です。

  5. 開発環境の統一: 複数の開発者からなるチームで作業する場合や、開発環境と本番環境が異なる場合、使用するPerlのバージョンを統一することは非常に重要です。バージョンが異なると、一方の環境では動作するスクリプトがもう一方では動作しない、といった問題が発生し、デバッグが困難になります。バージョンを確認し、可能であれば一致させることで、環境依存の問題を排除し、開発効率を向上させることができます。

  6. デバッグとサポート: 問題が発生した際に、使用しているPerlのバージョン情報は、問題解決のための最初のステップとなります。バグ報告を行う際や、他の開発者に助けを求める際に、正確なバージョン情報を伝えることは必須です。これにより、問題が特定のバージョンに固有のものか、あるいはコード自体の問題なのかを切り分ける手助けとなります。また、サポートを提供する側も、特定のPerlバージョンに関する既知の問題や回避策を提示しやすくなります。

これらの理由から、Perlを扱うすべての人にとって、現在のPerlバージョンを正確に把握し、その情報を活用できるようにすることは、基本的なスキルと言えるでしょう。

スクリプト内からPerlのバージョンを確認する

コマンドラインからバージョンを確認する方法は開発者にとって基本ですが、Perlスクリプトを実行中に、そのスクリプト自身がどのバージョンのPerlで実行されているかを知る必要がある場合もあります。これは、特定のバージョンに依存するコードを書く場合や、実行環境に応じた処理を分けたい場合に役立ちます。

Perlは、スクリプト内からバージョン情報を取得するための特別な変数やモジュールを提供しています。

特別変数 $^V ($OLD_VERSION)

最も直接的な方法は、組み込みの特別変数 $^V を使用することです。この変数は、Perl 5.6.0で導入されました。それ以前のバージョンでは $OLD_VERSION が使用されていましたが、現在は $^V を使うのが一般的です。

$^Vversion オブジェクトを返します。このオブジェクトは、バージョン番号を数値的な形式(例: v5.34.0)で表します。数値的な比較や操作が可能です。

“`perl

!/usr/bin/perl

use strict;
use warnings;
use version; # $^V を version オブジェクトとして扱うために use することを推奨

print “実行中の Perl バージョン: $^V\n”;

バージョン比較の例

if ($^V ge v5.30.0) {
print “Perl バージョンは 5.30.0 以上です。\n”;
} else {
print “Perl バージョンは 5.30.0 より古いです。\n”;
}

マイナーバージョン、パッチレベルへのアクセス (version オブジェクトのメソッド)

my $v_obj = version->parse($^V);
print “メジャーバージョン: “, $v_obj->major, “\n”; # Perl 5 なので常に 5
print “マイナーバージョン: “, $v_obj->minor, “\n”;
print “パッチレベル: “, $v_obj->patch, “\n”;
“`

このスクリプトを実行すると、以下のような出力が得られます(Perl 5.34.0で実行した場合)。

実行中の Perl バージョン: v5.34.0
Perl バージョンは 5.30.0 以上です。
メジャーバージョン: 5
マイナーバージョン: 34
パッチレベル: 0

use version;$^Vversion オブジェクトとして適切に扱うために推奨されます。特にバージョン番号の数値比較(ge, lt, == など)を行う際に、文字列比較ではなくバージョンとしての比較が行われるようになります。

Config モジュール

Perlのビルドに関するより詳細な情報をスクリプト内から取得したい場合は、標準モジュールである Config を使用します。このモジュールは、perl -V コマンドが出力する情報源となるもので、Perlがビルドされた際の様々な設定パラメータにアクセスできます。

Config モジュールは、%Config というハッシュを提供します。このハッシュのキーは、ビルド時の設定項目名、値はそれに対応する設定値です。

“`perl

!/usr/bin/perl

use strict;
use warnings;
use Config;

Config ハッシュからバージョン情報を取得

my $major_version = $Config{major};
my $minor_version = $Config{version}; # version はマイナーバージョン + パッチレベル
my $patch_level = $Config{patchlevel};

print “Config から取得したバージョン情報:\n”;
print ” メジャーバージョン: $major_version\n”;
print ” マイナーバージョン+パッチレベル: $minor_version\n”; # 例: 5.34.0
print ” パッチレベル (Config{patchlevel}形式): $patch_level\n”; # 例: 0

より詳細な情報

print ” ビルドされた OS: $Config{osname}\n”;
print ” ビルドされた アーキテクチャ: $Config{archname}\n”;
print ” コンパイラ: $Config{cc}\n”;
print ” Configure 設定フラグ: $Config{config_args}\n”;

%Config の全てのキーと値を出力 (非常に長い出力になります)

use Data::Dumper;

print Dumper \%Config;

“`

このスクリプトを実行すると、Config モジュールが保持するビルド時の設定に基づいて、様々な情報が出力されます。$Config{version} は、v5.34.0 のような形式ではなく、5.34.0 のような文字列としてバージョン全体を表すことが多いです。$Config{patchlevel} は、パッチレベルのみを示します。

%Config ハッシュには非常に多くの情報が含まれており、perl -V が出力する内容のほとんどは、この %Config の内容を整形して表示したものです。特定のビルド時オプションが有効になっているかなどをスクリプト内で確認する際に非常に有用です。

スクリプト内からバージョンを確認する方法を理解しておくことは、Perlプログラムのポータビリティや、特定の実行環境への適応性を高める上で役立ちます。

Perlの歴史とバージョン番号の関係性

Perlのバージョン番号は、その言語の進化の歴史を反映しています。バージョン番号を理解することは、Perlがどのように発展してきたのか、そしてなぜ現在のバージョン体系になっているのかを知る上で興味深いことです。

Perl 1からPerl 4

Perlは、ラリー・ウォールによって1987年にPerl 1.0として誕生しました。当時は主にテキスト処理やシステム管理のツールとして使用されていました。その後、機能拡張が行われ、Perl 2 (1988), Perl 3 (1989), Perl 4 (1991) とバージョンアップを重ねました。特にPerl 4は、スクリプト言語として広く普及し始め、多くのUNIXシステムで標準的に利用されるようになりました。これらのバージョンは、現代のPerl 5と比較すると機能面や設計思想で多くの違いがあります。

Perl 5: 現代のPerlの礎

Perlの歴史における最大の転換点は、1994年にリリースされたPerl 5です。Perl 5は、オブジェクト指向プログラミングのサポート、モジュール機構の導入、新しいデバッガ、改良された正規表現エンジンなど、Perl 4から大幅な変更と機能追加が行われました。このモジュール機構の導入は、CPANの誕生につながり、Perlエコシステムを爆発的に拡大させる原動力となりました。

Perl 5は、その後も改良が続けられ、現在に至るまで主要なPerlバージョンとして使われています。Perl 5のバージョン番号は 5.major.minor の形式が一般的でしたが、Perl 5.6以降は 5.minor.patch の形式に落ち着きました(前述の v5.minor.patch 形式とも関連します)。

  • 初期のPerl 5 (5.000 – 5.005): Perl 5の基盤が確立された時期です。正規表現の進化、参照とデータ構造、モジュール機構などが洗練されました。
  • Perl 5.6 (2000): 64ビット対応、Unicodeサポートの強化、スレッドの実験的なサポートなどが含まれました。
  • Perl 5.8 (2002): Unicodeのより堅牢なサポート、I/Oレイヤーの改善 (PerlIO)、スレッドの安定化など、現代のPerlの多くの基礎がこのバージョンで確立されました。多くのシステムで長らくデフォルトバージョンとして使われました。
  • Perl 5.10 (2007): スマートマッチ演算子 (~~)、say 関数、defined-or演算子 (//) など、新しい構文や機能が多数導入されました。CPANモジュールが5.10以降を要求することも増えました。
  • Perl 5.12 (2010): Strict and warnings pragma のデフォルト化が議論されるなど、モダンなコーディングスタイルへの移行が意識されました。package NAME { ... } 構文など。
  • Perl 5.14 (2011): Unicode 6.0 対応、新しい正規表現機能など。
  • Perl 5.16 (2012): substr の左辺値対応、version オブジェクトの組み込みなど。
  • Perl 5.18 (2013): ハッシュのランダム化によるセキュリティ強化(旧来のハッシュキー順序に依存するコードに影響)、新しい正規表現機能など。
  • Perl 5.20 (2014): 署名付きサブルーチンパラメータ、ハッシュのスライスの左辺値対応など。
  • Perl 5.22 (2015): エイリアス代入 (//= など)、新しい正規表現機能など。
  • Perl 5.24 (2016): デフォルトで strictwarnings が有効になるビルドオプションの導入など。
  • Perl 5.26 (2017): カレントディレクトリがデフォルトで @INC から削除されるなど、セキュリティ強化に関連する変更。
  • Perl 5.28 (2018): Unicode 11.0 対応、大きなファイルの処理能力向上など。
  • Perl 5.30 (2019): Unicode 12.1 対応、新しいセキュリティ対策など。
  • Perl 5.32 (2020): isa 演算子、より安全な乱数生成など。
  • Perl 5.34 (2021): defer ブロックの実験的サポート、より良いエラーメッセージなど。
  • Perl 5.36 (2022): class キーワードなど、オブジェクト指向機能の実験的サポート強化。
  • Perl 5.38 (2023): class キーワードが実験的ではなくなった、Unicode 15.0 対応など。

見てわかるように、Perl 5は非常に活発に開発が続けられており、約1年ごとに新しいマイナーバージョンがリリースされています。古いバージョンから新しいバージョンへの移行には、新機能の享受だけでなく、セキュリティやパフォーマンスの向上といった多くのメリットがあります。

Perl 6 / Raku

Perl 6は、Perl 5の欠点を克服し、現代的なプログラミング言語として再設計された全く新しい言語として開発が進められていました。しかし、その設計思想や実装がPerl 5とは大きく異なるため、互換性はほとんどありません。この違いを明確にするため、2019年にPerl 6は「Raku」として名称変更されました。RakuはPerlとは別の言語ファミリーに属すると考えるのが適切です。本記事で扱う「Perl」は、特に断りがない限りPerl 5を指します。

Perlのバージョン番号を理解することは、特定の機能がいつ導入されたか、どのバージョンのCPANモジュールが使用可能か、そしてどのバージョンへの移行を検討すべきかを判断する上で役立ちます。

複数のPerlバージョンを管理する方法

システムのデフォルトでインストールされているPerlのバージョンは一つだけであることが多いですが、開発やテストの目的で、複数のPerlバージョンを使い分けたい場合があります。例えば、古いPerlバージョンでしか動作しないレガシーなアプリケーションを保守しつつ、最新のPerlバージョンで新しい開発を行いたい、といった状況です。

このような場合に役立つのが、Perlバージョン管理ツールです。代表的なものに perlbrewplenv があります。これらのツールは、ユーザーのホームディレクトリ以下などにPerlの異なるバージョンをインストールし、環境変数やパスを適切に設定することで、簡単に使用するPerlバージョンを切り替えられるようにします。

これらのツールを利用することで、システムのデフォルトPerl環境を汚染することなく、複数のPerl環境を共存させ、プロジェクトごとに最適なPerlバージョンを選択できるようになります。

perlbrew

perlbrew は、Perlの特定のバージョンをソースコードからダウンロード、コンパイル、インストールするプロセスを自動化し、それらを管理するためのツールです。インストールされたPerl環境は $HOME/perl5/perlbrew/ 以下などに配置されます。

インストール:

まず、curlを使って perlbrew インストールスクリプトを取得し、実行します。

bash
\curl -L https://install.perlbrew.pl | bash

インストールが完了したら、シェル設定ファイル(例: ~/.bashrc, ~/.zshrc)に以下の行を追加し、シェルを再起動または source します。

bash
source ~/perl5/perlbrew/etc/bashrc

Perlバージョンのインストール:

利用可能なPerlバージョンを確認します。

bash
perlbrew available

特定のバージョンをインストールします。例えば、5.38.0をインストールする場合。

bash
perlbrew install perl-5.38.0

このコマンドは、指定したバージョンのPerlソースコードをダウンロードし、設定し、コンパイルし、インストールします。これには時間がかかります。-j N オプションで並列コンパイルを指定すると高速化できます(例: perlbrew install perl-5.38.0 -j 8)。

インストールされたバージョンの確認:

インストール済みのPerlバージョンを一覧表示します。

bash
perlbrew list

出力例:

perl-5.34.0
* perl-5.38.0
perl-5.8.9

アスタリスク (*) がついているバージョンが現在アクティブなバージョンです。

Perlバージョンの切り替え:

使用するPerlバージョンを切り替えます。

bash
perlbrew switch perl-5.38.0

または、一時的に特定のバージョンを使用する場合。現在のシェルセッション内でのみ有効です。

bash
perlbrew use perl-5.34.0

現在のバージョンの確認 (perlbrew使用時):

perlbrew で管理されているPerl環境を使用している場合、perl -v コマンドは、perlbrew が設定したパス上のPerlバイナリのバージョンを出力します。

bash
perl -v

これで、perlbrew で切り替えたバージョンの情報が表示されるはずです。

ライブラリ環境の管理 (perlbrew lib):

perlbrew は、それぞれのPerlバージョンに対して独立したライブラリ環境(インストールされたCPANモジュール群)を持つことができます。これにより、あるバージョンのPerlにインストールしたモジュールが他のバージョンに影響を与えることを防げます。

ライブラリ環境を作成・使用するには perlbrew lib コマンドを使います。

“`bash

現在アクティブな Perl バージョンに対して、特定のライブラリ環境を作成

perlbrew lib create [email protected]

作成したライブラリ環境を使用する

perlbrew switch perl-5.38.0@my_libs
“`

これにより、perl-5.38.0$HOME/perl5/perlbrew/libs/[email protected]/ 以下にCPANモジュールがインストールされるようになります。

plenv

plenv は、rbenvpyenv といった他の言語のバージョン管理ツールにインスパイアされて作られたPerlバージョン管理ツールです。こちらも $HOME/.plenv 以下などにPerlをインストールし、シェルのパスを操作することでバージョンを切り替えます。

インストール:

plenv はGitリポジトリをクローンしてインストールするのが一般的です。

bash
git clone https://github.com/tokuhirom/plenv.git ~/.plenv
git clone https://github.com/tokuhirom/perl-build.git ~/.plenv/plugins/perl-build

perl-build は、plenv がPerlをビルドするために使用するプラグインです。

インストール後、シェル設定ファイルに以下を追加し、シェルを再起動または source します。

bash
export PATH="$HOME/.plenv/bin:$PATH"
eval "$(plenv init -)"

Perlバージョンのインストール:

インストール可能なバージョンを確認します。

bash
plenv install -l

特定のバージョンをインストールします。

bash
plenv install 5.38.0

plenv も内部で perl-build を使用してソースからのビルドを行います。

インストールされたバージョンの確認:

インストール済みのバージョン一覧を表示します。

bash
plenv versions

出力例:

5.34.0
* 5.38.0
5.8.9

ここでもアスタリスクが現在使用されているバージョンを示します。

Perlバージョンの切り替え:

plenv には、グローバルなバージョン設定、ディレクトリローカルな設定、そしてシェルの設定があります。

  • グローバル設定: システム全体(ただし、plenv を有効にしたシェル)のデフォルトバージョンを設定します。

    bash
    plenv global 5.38.0

  • ローカル設定: 現在のディレクトリとそのサブディレクトリでのみ有効なバージョンを設定します。プロジェクトごとにバージョンを固定したい場合に便利です。カレントディレクトリに .perl-version というファイルが作成されます。

    bash
    plenv local 5.34.0

  • シェル設定: 現在のシェルセッション内でのみ有効なバージョンを設定します。最も優先順位が高い設定です。

    bash
    plenv shell 5.8.9

現在のバージョンの確認 (plenv使用時):

plenv が有効なシェルで perl -v を実行すると、plenv によって設定されたパス上のPerlバイナリのバージョンが出力されます。

bash
perl -v

また、plenv version コマンドでも現在のバージョンと、それがどの設定(global, local, shell)で選択されているかを確認できます。

bash
plenv version

出力例:

5.38.0 (set by /Users/yourname/.plenv/version) # global の場合
5.34.0 (set by /path/to/your/project/.perl-version) # local の場合
5.8.9 (set by from shell) # shell の場合

どちらを選ぶか?

perlbrewplenv は機能的に似ていますが、設計思想や使い勝手に若干の違いがあります。

  • perlbrew: よりPerl中心のツールで、ライブラリセットの管理機能が統合されています。Perl環境全体を切り替える感覚に近いです。
  • plenv: 他の言語のバージョン管理ツールと操作感が似ており、多言語を扱う開発者にはなじみやすいかもしれません。ディレクトリごとの設定 (.perl-version) は、プロジェクトごとにバージョンを固定するのに便利です。

どちらのツールも十分に成熟しており、活発にメンテナンスされています。個人の好みやワークフローに合わせて選択してください。

モジュールのバージョンを確認する

Perlインタプリタ自体のバージョンだけでなく、インストールされているCPANモジュールのバージョンを確認することも、互換性や依存関係の問題を解決する上で非常に重要です。特定の機能がモジュールの特定のバージョンで導入されたり、バグが修正されたりすることがよくあります。

モジュールのバージョンを確認する方法はいくつかあります。

1. perldoc -m Module::Name を使用する

多くのPerlモジュールは、自身のバージョン情報を $VERSION というパッケージ変数に保持しています。perldoc コマンドに -m オプションとモジュール名を指定すると、そのモジュールのソースコードが表示されます。ソースコードの冒頭や末尾に $VERSION 変数の定義を見つけることができます。

bash
perldoc -m Some::Module | grep '$VERSION'

例: LWP::UserAgent のバージョンを確認

bash
perldoc -m LWP::UserAgent | grep '$VERSION'

出力例:

perl
our $VERSION = "6.69";

これは、インストールされている LWP::UserAgent のバージョンが 6.69 であることを示しています。ただし、すべてのモジュールが $VERSION を定義しているわけではありません(ほとんどのCPANモジュールは定義していますが)。

2. CPANクライアントを使用する

cpan または cpanp (CPANPLUS) といったCPANクライアントツールには、インストールされているモジュールの情報を表示する機能があります。

例えば、cpan シェル内で d (distinfo) コマンドを使う方法です。

“`bash
cpan

d LWP::UserAgent
“`

出力例:

... (他の情報に続いて) ...
Installed version: 6.69
...

または、cpanp シェルで i (info) コマンドを使う方法。

bash
cpanp
cpanp> i LWP::UserAgent

出力例:

...
-- Module Information --
Module: LWP::UserAgent
Installed: 6.69
CPAN: 6.69
...

これらの方法は、モジュールのバージョンだけでなく、作者や説明、依存関係などの他の情報も一緒に確認できるのが利点です。

3. スクリプトから確認する

Perlスクリプト内で、特定のモジュールのバージョンを確認することも可能です。これは、スクリプトが依存するモジュールのバージョンが要件を満たしているかを確認し、満たしていない場合にエラーを出す、といった処理に利用できます。

モジュールが $VERSION 変数をエクスポートしている場合、その変数にアクセスできます。ただし、モジュールによっては $VERSION がエクスポートされていない(つまりプライベートな)場合もあります。確実にアクセスするには、完全なパッケージ名を指定します。

“`perl

!/usr/bin/perl

use strict;
use warnings;

確認したいモジュールを use/require する

eval {
require LWP::UserAgent;
1; # require が成功したら 1 を返す
} or die “LWP::UserAgent モジュールが見つかりません: $@\n”;

$VERSION 変数にアクセス (完全なパッケージ名を使用)

if (defined $LWP::UserAgent::VERSION) {
print “インストールされている LWP::UserAgent のバージョン: $LWP::UserAgent::VERSION\n”;

# バージョン比較の例 (use version; と version オブジェクトを使うと便利)
use version;
if (version->parse($LWP::UserAgent::VERSION) ge v6.00) {
    print "バージョンは 6.00 以上です。\n";
} else {
    print "バージョンは 6.00 より古いです。\n";
}

} else {
print “LWP::UserAgent モジュールは \$VERSION を定義していません。\n”;
}

Module::Info モジュールを使う方法 (インストールが必要な場合がある)

use Module::Info;

my $info = Module::Info->new_from_module(‘LWP::UserAgent’);

if ($info) {

print “Module::Info で取得した LWP::UserAgent のバージョン: “, $info->version, “\n”;

} else {

print “Module::Info で LWP::UserAgent の情報を取得できませんでした。\n”;

}

“`

このスクリプトは、LWP::UserAgent モジュールを読み込み、その $LWP::UserAgent::VERSION 変数の値を表示します。version モジュールを使うと、バージョン番号を数値として扱い、安全に比較できます。

Module::Info というCPANモジュールを使うと、インストールされている任意のモジュールの情報を、スクリプトからより構造化された方法で取得できます。ただし、これは標準モジュールではないため、事前にインストールが必要です。

perl -V: 詳細なビルド設定を確認する

perl -v は要約されたバージョン情報を提供しますが、Perlのビルドに関するより詳細な情報、特にコンパイル時の設定オプションやリンクされているライブラリ、ファイルパスなどを確認したい場合は、大文字の -V オプションを使用します。

bash
perl -V

このコマンドは、perl -v の出力内容も含みつつ、Perlがどのようにコンパイルされ、どの機能が有効になっているかを示す非常に長い設定情報のリストを出力します。この出力は、特定の環境で発生する問題をデバッグする際や、Perlビルドの互換性を確認する際に非常に重要です。

以下は、perl -V 出力の一例と、その主要な部分の解説です(実際の出力は環境によって大きく異なります)。

“`
Summary of my perl5 (revision 5 version 34 subversion 0) configuration:
Perl version : 5.34.0
Platform:
osname : linux
osvers : 5.11.0-41-generic
archname : x86_64-linux-thread-multi
uname : Linux yourhostname 5.11.0-41-generic #45~20.04.1-Ubuntu SMP Mon Nov 15 16:42:12 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
config_args : -des -Duseshrplib -Duselargefiles -Duselocksytype -Dgccusestextsegment -Doptimize=’-O2 -g’ -Dprefix=/usr -Dlocalinc=/usr/local/include -Dlocallib=/usr/local/lib -Dlocalarz=/usr/local/lib/perl/5.34.0/x86_64-linux-thread-multi -Dprivlib=/usr/share/perl/5.34 -Darchlib=/usr/lib/x86_64-linux-gnu/perl/5.34 -Dsitelib=/usr/local/share/perl/5.34.0 -Sitearch=/usr/local/lib/x86_64-linux-gnu/perl/5.34.0 -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/x86_64-linux-gnu/perl5 -Dscriptdir=/usr/bin -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dusesitedirs -Dvendorprefix=/usr -Dinstallusrbinperl -Dsort_dirent -Dversion=5.34.0 -Dpatchlevel=0
hint : recommended setting on linux, gcc+glibc
libc : libc-2.33.so
bincompat5005 : disabled
Compiler:
cc : gcc
ccflags : -D_FORTIFY_SOURCE=2 -Wall -Wextra -Wc++-compat -Wwrite-strings -Wno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2 -DDEBUGGING
optimize : -O2 -g
cppflags : -D_FORTIFY_SOURCE=2 -Wall -Wextra -Wc++-compat -Wwrite-strings -Wno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -DDEBUGGING
ccversion : gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
cppversion : gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
linkflags : -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,–as-needed -L/usr/local/lib -fstack-protector-strong
libpth : /usr/local/lib /usr/lib/x86_64-linux-gnu /usr/lib /lib/x86_64-linux-gnu /lib
libs : -lperl -ldl -lm -lpthread -lc -lcrypt
uvsafe : undef
Extension directory : /usr/lib/x86_64-linux-gnu/perl/5.34/auto
Config dependencies :
SDBM_FILE : Yes
NDBM_FILE : Yes
GDBM_FILE : Yes
OSSP_uuid : Yes
Socket : Yes
PerlIO::encoding : Yes
PerlIO::scalar : Yes
PerlIO::utf8 : Yes
Optional features :
threads : enabled
largefiles : enabled
indirect : enabled
lockthreads : enabled
multiplicity : enabled
useithreads : enabled
usemultiplicity : enabled
useclone : enabled
useshrplib : enabled
libperl : uses shared library
gdbm : enabled
ndbm : enabled
sdbm : enabled
osspuuid : enabled
syscalls : enabled
mallocarena : undef
mallocwrap : undef
mbbs : enabled
complex : enabled
bidirectional_unicode: enabled
unicode_properties: enabled
unicode_version : 13.0
utf8_strings : enabled
Built under : debian
Compile-time options:
DEBUGGING
PERL_FATAL_WARNINGS
PERL_SCAN_BYTES
PERL_USE_DEVEL
USE_64_BIT_ALL
USE_ITHREADS
USE_LARGE_FILES
USE_LOCALE
USE_LOCALE_CTYPE
USE_LOCALE_NUMERIC
USE_LOCALE_TIME
USE_LONG_DOUBLE
USE_MALLOC_WRAP
USE_MULTIIPLICITY
USE_PERLIO
USE_REENTRANT_API
USE_SITECUSTLIB
USE_SITEFIRST
USE_SITEMAIN
USE_UNIVERSAL_INTERN
USE_UNICODE_PROPERTIES
USE_UTF8_ALL
USE_UTF8_LOCALE
USE_VERSION_STRING

Locale:
@INC : /etc/perl
/usr/local/lib/x86_64-linux-gnu/perl/5.34.0
/usr/local/share/perl/5.34.0
/usr/lib/x86_64-linux-gnu/perl5
/usr/share/perl5
/usr/lib/x86_64-linux-gnu/perl/5.34
/usr/share/perl/5.34
/usr/local/lib/site_perl
/usr/lib/x86_64-linux-gnu/perl/5.34.0/auto

Built details :
Build date : Mon Nov 15 19:45:24 2021
Built by : buildd@lcy02-amd64-105 #45~20.04.1-Ubuntu SMP Mon Nov 15 16:42:12 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
Configure command : ‘./Configure -des -Duseshrplib -Duselargefiles -Duselocksytype -Dgccusestextsegment -Doptimize=-O2 -g -Dprefix=/usr -Dlocalinc=/usr/local/include -Dlocallib=/usr/local/lib -Dlocalarz=/usr/local/lib/perl/5.34.0/x86_64-linux-thread-multi -Dprivlib=/usr/share/perl/5.34 -Darchlib=/usr/lib/x86_64-linux-gnu/perl/5.34 -Dsitelib=/usr/local/share/perl/5.34.0 -Sitearch=/usr/local/lib/x86_64-linux-gnu/perl/5.34.0 -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/x86_64-linux-gnu/perl5 -Dscriptdir=/usr/bin -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dusesitedirs -Dvendorprefix=/usr -Dinstallusrbinperl -Dsort_dirent -Dversion=5.34.0 -Dpatchlevel=0′
Config_args : -des -Duseshrplib -Duselargefiles -Duselocksytype -Dgccusestextsegment -Doptimize=’-O2 -g’ -Dprefix=/usr -Dlocalinc=/usr/local/include -Dlocallib=/usr/local/lib -Dlocalarz=/usr/local/lib/perl/5.34.0/x86_64-linux-thread-multi -Dprivlib=/usr/share/perl/5.34 -Darchlib=/usr/lib/x86_64-linux-gnu/perl/5.34 -Dsitelib=/usr/local/share/perl/5.34.0 -Sitearch=/usr/local/lib/x86_64-linux-gnu/perl/5.34.0 -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/x86_64-linux-gnu/perl5 -Dscriptdir=/usr/bin -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dusesitedirs -Dvendorprefix=/usr -Dinstallusrbinperl -Dsort_dirent -Dversion=5.34.0 -Dpatchlevel=0
Kernelsame : 5.11.0-41-generic
Configscherish : t
Configtraverse : t
Configtrust : t
Configtarget : t
Configtype : t
Configvalid : 1
Built with :
cc -D_FORTIFY_SOURCE=2 -Wall -Wextra -Wc++-compat -Wwrite-strings -Wno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2 -DDEBUGGING -DPERL_FATAL_WARNINGS -DPERL_SCAN_BYTES -DPERL_USE_DEVEL -DUSE_64_BIT_ALL -DUSE_ITHREADS -DUSE_LARGE_FILES -DUSE_LOCALE -DUSE_LOCALE_CTYPE -DUSE_LOCALE_NUMERIC -DUSE_LOCALE_TIME -DUSE_LONG_DOUBLE -DUSE_MALLOC_WRAP -DUSE_MULTIIPLICITY -DUSE_PERLIO -DUSE_REENTRANT_API -DUSE_SITECUSTLIB -DUSE_SITEFIRST -DUSE_SITEMAIN -DUSE_UNIVERSAL_INTERN -DUSE_UNICODE_PROPERTIES -DUSE_UTF8_ALL -DUSE_UTF8_LOCALE -DUSE_VERSION_STRING -O2 -g -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,–as-needed -L/usr/local/lib -fstack-protector-strong -lperl -ldl -lm -lpthread -lc -lcrypt
“`

この出力は非常に長いため、全てを網羅的に解説することは難しいですが、重要な項目をいくつかピックアップして説明します。

Summary of my perl5 configuration:

これは、Perlのビルド設定の概要を示すセクションの開始です。

  • Perl version: perl -v と同じ基本的なバージョン情報です。
  • Platform: Perlがビルドされたプラットフォーム(OS、アーキテクチャ)に関する詳細。
    • osname: オペレーティングシステムの内部名(例: linux, darwin, MSWin32)。
    • osvers: OSのバージョン。
    • archname: アーキテクチャ名(perl -v と同じ)。
    • uname: uname -a コマンドの出力に相当する、システムに関するさらに詳細な情報。
    • config_args: これは非常に重要です。 このPerlをビルドする際に Configure スクリプトに渡されたコマンドライン引数を全て示しています。-D で始まるオプションは、特定の機能の有効/無効や、インストールパス、コンパイラオプションなどを指定しています。
      • -Dprefix=/usr: インストール先のプレフィックスディレクトリ。Perlバイナリや標準ライブラリが /usr/bin, /usr/lib, /usr/share の下などにインストールされます。
      • -Duseshrplib: 共有ライブラリ版の libperl を使用するようにビルドされたか。多くのシステムでは動的にリンク可能な共有ライブラリを使用します。
      • -Duselargefiles: 2GB以上のファイルを扱えるようにビルドされたか。現代のシステムではほぼ必須のオプションです。
      • -Duseithreads: インタプリタスレッド(ネイティブスレッド)をサポートするようにビルドされたか。perl -vthread-multi に対応します。
      • -DDEBUGGING: デバッグシンボルを含めてビルドされたか。パフォーマンスには影響しますが、デバッガ使用時やクラッシュ解析時に役立ちます。
      • -Duse64bitint / -Duse64bitall: 64ビット整数型やポインタを使用するようにビルドされたか。現代の64ビットOSでは通常有効になっています。
      • -Dcc=gcc, -Doptimize='-O2 -g', -Dccflags='...': 使用されたCコンパイラ (cc)、最適化フラグ (optimize)、追加のコンパイラフラグ (ccflags)。これらの情報は、パフォーマンス特性や特定のコンパイル時エラーの原因調査に役立ちます。
      • -Dprivlib, -Darchlib, -Dsitelib, -Sitearch, -Dvendorlib, -Dvendorarch: 標準ライブラリ、アーキテクチャ依存ライブラリ、site-specificライブラリ(ユーザーやサードパーティがインストール)、vendorライブラリ(OSベンダーが提供)などの検索パスのデフォルト設定。これらは後述の @INC のデフォルト値にも影響します。
    • hint: ビルド時に使用された「ヒントファイル」に関する情報。PerlのConfigureプロセスは、様々なOSやコンパイラ環境に合わせたヒントファイルを使用して、ビルド設定を自動調整します。
    • libc: 使用されているC標準ライブラリのバージョン。

Compiler:

Perlをコンパイルするために使用されたCコンパイラとその設定に関する詳細。

  • cc: 使用されたCコンパイラのコマンド名(例: gcc, clang, cl)。
  • ccflags, optimize, cppflags: コンパイラに渡された各種フラグ。
  • ccversion, cppversion: コンパイラとそのプリプロセッサのバージョン。
  • linkflags, libpth, libs: リンカーに渡されたフラグ、ライブラリ検索パス、リンクされたライブラリ。ここでリンクされているライブラリ(例: -ldl, -lm, -lpthread)を確認できます。

Extension directory:

XSモジュール(Cなどで書かれたPerl拡張モジュール)がデフォルトでインストールされるディレクトリ。

Config dependencies:

特定の組み込みモジュールや機能が、ビルド時に依存していた外部ライブラリや設定に関する情報。

Optional features:

Perlビルドで有効になったオプション機能のリスト。

  • threads: スレッドサポートが有効か。
  • largefiles: ラージファイルサポートが有効か。
  • useshrplib: 共有ライブラリ版の libperl を使用するか。
  • unicode_version: サポートしているUnicodeのバージョン。
  • utf8_strings: 内部的にUTF-8文字列を効率的に扱えるか。

これらのフラグは、config_args-D オプションと関連しています。

Built under:

この特定のビルドが、どのシステムで実行されたか(通常、ビルドサーバーの情報)。

Compile-time options:

Perlのコンパイル時に有効になった #define マクロのリスト。これは、Perlインタプリタの動作の非常に低レベルな部分に影響を与えます。例: DEBUGGING, USE_ITHREADS, USE_LARGE_FILES, USE_UNICODE_PROPERTIES など。これらも config_args で指定された内容が反映されます。

Locale:

Perlがモジュールを探すデフォルトのディレクトリリスト (@INC) です。Perlスクリプトで use Module::Name; または require Module::Name; と書いたとき、Perlインタプリタはこのリストのディレクトリを順番に探し、モジュールファイルを見つけます。このリストの順序や含まれるディレクトリは、インストールされているPerlのバージョン、ビルド時の設定 (-Dprivlib, -Dsitelib など)、そして環境変数 (PERL5LIB など) によって決まります。モジュールが見つからない (Can't locate ... in @INC) というエラーは、しばしばこの @INC の内容と、モジュールが実際にインストールされている場所が一致しない場合に発生します。

Built details:

ビルドに関する最終的な詳細情報。

  • Build date: ビルドが完了した日時。
  • Built by: 誰(またはどのシステム)がビルドを実行したか。
  • Configure command, Config_args: ビルド時に実行された Configure コマンドとその引数(config_args と重複しますが、こちらの方が正確なコマンドラインに近い形式で表示されることがあります)。
  • Built with: 実際に使用されたCコンパイラコマンドとその引数全体。

Config モジュールとの関係

前述のスクリプト内から利用できる Config モジュール (%Config ハッシュ) は、この perl -V が表示する情報のソースです。perl -V は、Config.pm モジュールを読み込み、%Config ハッシュの内容を整形して表示しています。したがって、perl -V で表示される情報の各項目は、スクリプト内から $Config{項目名} の形式でアクセスできることが多いです。

perl -V は、Perlのビルド環境に関する膨大な情報を提供するため、特にシステム管理者や、CPANモジュールのインストール問題、あるいはPerlインタプリタ自体の動作に関する問題をデバッグする際には不可欠なツールです。例えば、「モジュールXがインストールできないのは、Perlがスレッド対応でビルドされていないからではないか?」といった仮説検証や、「OSの標準提供Perlと、自分でソースからビルドしたPerlで動作が違うのは、コンパイルオプションが違うからではないか?」といった原因特定の際に役立ちます。

まとめ

本記事では、Perlコマンドを使ったバージョン確認の方法について、基本的な perl -v コマンドから始まり、その出力内容の詳細、なぜバージョン確認が重要なのか、スクリプト内でのバージョン確認方法、Perlの歴史的バージョン、複数のPerlバージョンを管理するツール (perlbrew, plenv)、モジュールのバージョン確認方法、そして詳細なビルド設定を確認するための perl -V コマンドに至るまで、幅広く解説しました。

Perlのバージョン情報は、開発の効率性、アプリケーションの互換性、システムのセキュリティ、そして問題発生時のデバッグにおいて、その根幹をなす重要な要素です。単にバージョン番号を知るだけでなく、perl -vperl -V から得られる情報が、Perlのビルド環境や機能サポート、ライブラリ検索パスなど、開発や運用に直接関わる様々な側面を反映していることを理解することが重要です。

perl -v は素早くバージョンを確認したい場合に、perl -V はより詳細な環境情報を知りたい場合に、そして $^VConfig モジュールはスクリプト内からバージョン情報にアクセスしたい場合に使い分けます。また、複数のPerlバージョンを扱う必要がある場合は、perlbrewplenv といったバージョン管理ツールが非常に有効です。CPANモジュールのバージョン確認も、依存関係の解決や互換性の問題回避のために欠かせません。

この記事で解説した知識を活用し、あなたのPerl開発や運用がよりスムーズで効率的なものとなることを願っています。定期的なバージョン確認と、必要に応じたアップデートを習慣づけることで、Perlの最新機能やセキュリティ対策の恩恵を享受し、より安全で堅牢なアプリケーションを開発・運用していきましょう。


上記記事は、Perlのバージョン確認に関する基本的なコマンドから、その出力の詳細、重要性、関連ツール、歴史、より詳細なビルド情報までを網羅し、約5000語の要件を満たすように詳細な説明を加えて記述しました。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール