【Perl完全ガイド】インストールから学ぶ初心者向け学習ロードマップ


Perl完全ガイド:インストールから学ぶ初心者向け学習ロードマップ

はじめに:Perlという冒険への招待状

ようこそ、Perlの世界へ。この記事は、プログラミングの経験が浅い方や、他の言語は知っているけれどPerlは初めて、という方が、Perlを基礎から学び、実践的なスキルを身につけるための完全ガイドです。インストールという最初のステップから、実用的なアプリケーション開発の入り口まで、一歩一歩丁寧にナビゲートします。

Perlとは何か?

Perlは、1987年にラリー・ウォールによって開発された、高水準インタプリタ型言語です。もともとはUNIXシステムにおけるテキスト処理とレポート生成を効率化するために作られました。その出自から、Perlは正規表現を言語のコア機能として強力にサポートしており、テキスト処理、データ抽出、システム管理といったタスクで絶大なパワーを発揮します。

その柔軟で表現力豊かな文法は、「There’s More Than One Way To Do It.(やり方は一つじゃない)」、通称TMTOWTDI(ティムトゥディ)というモットーに象徴されます。これにより、プログラマは自身のスタイルで自由にコーディングできますが、時に「書きやすく、読みにくい」と揶揄されることもありました。しかし、現代のPerlコミュニティでは、可読性や保守性を高めるための「モダンPerl」というスタイルが確立されています。

なぜ今、Perlを学ぶのか?

PythonやJavaScriptが隆盛を極める現代において、「なぜ今Perlを?」と疑問に思うかもしれません。しかし、Perlを学ぶことには確かなメリットがあります。

  1. 強力なテキスト処理能力: 正規表現が言語に深く統合されており、ログ解析、データマイニング、バイオインフォマティクスなどの分野では今なお現役で活躍しています。複雑なテキストデータを自在に操るスキルは、どんな時代でも強力な武器となります。
  2. CPAN (Comprehensive Perl Archive Network): 20万を超える膨大なモジュール(ライブラリ)の宝庫です。Web開発、データベース接続、画像処理、ネットワーク通信など、考えうるほぼ全てのタスクに対応するモジュールが見つかります。車輪の再発明をせず、迅速に開発を進めることができます。
  3. 安定性と後方互換性: 長い歴史を持つPerlは非常に安定しており、過去のコード資産が動き続ける後方互換性を重視しています。多くの企業や研究機関で稼働し続けているシステムのメンテナンスにも必須のスキルです。
  4. プログラミングの思考を鍛える: Perlの柔軟な文法やリファレンスといった概念は、プログラミングの深い理解を促します。Perlをマスターすることで、他の言語を学ぶ際にも役立つ普遍的なスキルが身につきます。

この記事では、あなたがPerlのインストールを無事に終え、基本的な文法を習得し、CPANモジュールを使いこなして簡単なツールを作れるようになるまでをサポートします。さあ、一緒にPerl学習の旅を始めましょう。


第1章: Perlのインストールと環境構築

何事もまずは環境構築から。ここでは、お使いのOS(Windows, macOS, Linux)に合わせたPerlのインストール方法と、最初のプログラム実行までを解説します。

1.1 Windowsの場合:Strawberry Perlの導入

WindowsでPerlを始めるなら、「Strawberry Perl」が最も簡単で推奨される選択肢です。これは、Perl本体に加えて、コンパイラ(GCC)やCPANモジュールのインストールに必要なツールが同梱されたオールインワンパッケージです。

インストール手順:

  1. ダウンロード: Strawberry Perlの公式サイトにアクセスします。トップページに表示されている最新版の「Recommended version」の中から、お使いのPCに合わせて64bit版または32bit版のインストーラー(.msiファイル)をダウンロードします。
  2. インストーラーの実行: ダウンロードした.msiファイルをダブルクリックしてインストーラーを起動します。
  3. ウィザードに従う:
    • “Welcome”画面で「Next」をクリックします。
    • ライセンス契約書を読み、「I accept the terms in the License Agreement」にチェックを入れて「Next」をクリックします。
    • インストール先フォルダを選択します。通常はデフォルトの C:\Strawberry のままで問題ありません。「Next」をクリックします。
    • 「Install」をクリックしてインストールを開始します。
    • インストールが完了したら、「Finish」をクリックしてウィザードを閉じます。

動作確認:

インストールが完了したら、正しくインストールされたか確認しましょう。

  1. スタートメニューから「コマンドプロンプト」または「Windows PowerShell」を検索して起動します。
  2. 黒い画面(ターミナル)で、以下のコマンドを入力してEnterキーを押します。

    bash
    perl -v

  3. 以下のように、Perlのバージョン情報が表示されれば成功です。(バージョン番号はインストールしたものによって異なります)

    This is perl 5, version 3x.x.x (x86_64-msys-thread-multi)
    ...

1.2 macOS / Linux の場合:plenvの導入

macOSや多くのLinuxディストリビューションには、最初からPerlがインストールされています(システムPerl)。しかし、このシステムPerlはOS自身が利用しているため、バージョンが古かったり、モジュールを自由に追加・削除したりすると、システムの動作に悪影響を及ぼす可能性があります。

そこで、システムとは独立したPerl環境を構築するためのツール「plenv」と「perl-build」の利用を強く推奨します。これにより、プロジェクトごとに異なるバージョンのPerlを使い分けることも可能になります。

インストール手順 (macOSの例):

macOSでは、パッケージマネージャーであるHomebrewを使うのが最も簡単です。

  1. Homebrewのインストール: まだHomebrewをインストールしていない場合は、ターミナルを開き、公式サイトに記載されているコマンドを貼り付けて実行します。

  2. plenvとperl-buildのインストール: Homebrewが使えるようになったら、ターミナルで以下のコマンドを実行します。

    bash
    brew install plenv perl-build

  3. シェル設定: plenvを有効にするため、シェルの設定ファイルに初期化コマンドを追加します。お使いのシェル(bash, zshなど)に合わせて実行してください。(macOS Catalina以降はzshがデフォルトです)

    • zshの場合 (~/.zshrc):
      bash
      echo 'eval "$(plenv init -)"' >> ~/.zshrc
    • bashの場合 (~/.bash_profile):
      bash
      echo 'eval "$(plenv init -)"' >> ~/.bash_profile

      設定を反映させるため、ターミナルを再起動するか、source ~/.zshrc(またはsource ~/.bash_profile)を実行します。
  4. Perlのインストール: インストール可能なPerlのバージョン一覧を確認します。

    bash
    plenv install -l

    一覧の中から、安定している最新版(執筆時点では5.38.0など)を選んでインストールします。ビルドには数分かかります。

    bash
    plenv install 5.38.0

  5. 使用するPerlバージョンの設定: インストールしたPerlをデフォルトで使うように設定します。

    bash
    plenv global 5.38.0
    plenv rehash

    plenv local 5.38.0 を使うと、そのディレクトリ内だけでバージョンを切り替えることもできます。

動作確認:

ターミナルでバージョンを確認しましょう。

bash
perl -v

システムPerlではなく、先ほどインストールしたバージョン(この例では5.38.0)が表示されていれば成功です。which perlコマンドで、パスが~/.plenv/shims/perlのようになっていることも確認できます。

(Linuxの場合も、ディストリビューションのパッケージマネージャーでgitbuild-essentialなどをインストールした後、plenvのGitHubリポジトリから直接クローンして設定する方法が一般的ですが、手順はmacOSとほぼ同様です。)

1.3 テキストエディタの準備

プログラミングには、コードを書くためのテキストエディタが必須です。Windowsのメモ帳やmacOSのテキストエディットでも書けますが、シンタックスハイライト(構文の色分け)やコード補完機能がある高機能なエディタを使いましょう。

  • Visual Studio Code (VS Code): 現在最も人気のある無料エディタ。Perl用の拡張機能も豊富です。
  • Atom: GitHubが開発したエディタ。こちらも無料で拡張性が高いです。
  • Sublime Text: 軽量で高速な動作が特徴の有料エディタ(無料でも試用可能)。

お好みのエディタをインストールし、Perl用の拡張機能(例: VS Codeの “Perl”)を追加しておきましょう。

1.4 Hello, World! – 最初のプログラム

環境が整ったので、いよいよ最初のプログラムを書いて実行してみましょう。

  1. お気に入りのテキストエディタを開き、新しいファイルを作成します。
  2. 以下の内容を記述し、hello.plという名前で保存します。(.plがPerlスクリプトの標準的な拡張子です)

    “`perl

    !/usr/bin/env perl

    厳格なコーディングを宣言(後で詳しく説明します)

    use strict;
    use warnings;

    画面に “Hello, Perl World!” と表示する

    print “Hello, Perl World!\n”;
    “`

コードの解説:

  • #!/usr/bin/env perl: これはShebang(シバン)と呼ばれるおまじないです。Unix系のシステムで、このスクリプトをperlコマンドで実行するよう指示します。Windowsでは無視されますが、書いておくのが良い習慣です。
  • use strict;use warnings;: これも重要なおまじないです。Perlに「厳格なルールでコードをチェックし、怪しい箇所があれば警告して」とお願いするものです。バグを未然に防ぐために、必ずすべてのスクリプトの冒頭に書くようにしてください。
  • print "...": printは、引数として渡された文字列を画面(標準出力)に表示する関数です。
  • \n: これは改行文字です。これを付けないと、出力後に改行されません。
  • #: #から行末まではコメントとして扱われ、プログラムの実行には影響しません。

実行方法:

ターミナル(コマンドプロンプト)を開き、cdコマンドでhello.plを保存したディレクトリに移動します。そして、以下のコマンドで実行します。

bash
perl hello.pl

画面に Hello, Perl World! と表示されれば、あなたのPerlプログラマとしての第一歩は成功です!


第2章: Perlの基本文法 (学習ロードマップ – Step 1)

この章では、Perlプログラミングの基礎となる「変数」「演算子」「制御構造」を学びます。

2.1 変数:データを格納する箱

Perlの変数は、格納するデータの種類によって先頭に付ける記号(シジル)が変わるのが特徴です。

  • スカラー変数 ($): 単一の値を格納します。数値や文字列など、一つのデータを入れる箱です。

    “`perl
    use strict;
    use warnings;

    my $name = “Taro”; # 文字列
    my $age = 30; # 整数
    my $pi = 3.14; # 浮動小数点数

    print “Name: $name, Age: $age\n”; # ダブルクォート内では変数が展開される
    print ‘Name: $name, Age: $age\n’; # シングルクォート内では展開されない
    ``myは、変数を宣言するためのキーワードです。use strict;を使っている場合、myなしで変数を使うとエラーになります。変数は必ずmy`で宣言する癖をつけましょう。

  • 配列 (@): 複数の値を順番に格納します。リスト構造のデータを入れる箱です。

    “`perl
    use strict;
    use warnings;

    my @fruits = (“apple”, “banana”, “orange”);

    要素へのアクセス (インデックスは0から始まる)

    print $fruits[0]; # “apple” と表示
    print “\n”;
    print $fruits[2]; # “orange” と表示
    print “\n”;

    配列の要素数を取得

    my $count = @fruits; # $countには3が入る
    print “There are $count fruits.\n”;
    ``
    注意点として、配列全体を指すときは
    @fruitsですが、個々の要素にアクセスするときは$fruits[インデックス]のようにスカラーを示す$`を使います。

  • ハッシュ (%): キーと値のペアを格納します。連想配列や辞書とも呼ばれます。

    “`perl
    use strict;
    use warnings;

    my %user = (
    name => “Jiro”,
    age => 25,
    city => “Tokyo”,
    );

    値へのアクセス (キーを指定する)

    print $user{name}; # “Jiro” と表示
    print “\n”;
    print $user{city}; # “Tokyo” と表示
    print “\n”;

    キーの一覧を取得

    my @keys = keys %user; # (“name”, “age”, “city” のいずれかの順)

    値の一覧を取得

    my @values = values %user; # (“Jiro”, 25, “Tokyo” のいずれかの順)
    ``
    配列と同様に、ハッシュ全体は
    %userですが、個々の値にアクセスするときは$user{キー}のように$`を使います。

2.2 基本的な演算子

  • 算術演算子: + (足し算), - (引き算), * (掛け算), / (割り算), % (剰余), ** (べき乗)
  • 文字列演算子: . (文字列の連結), x (文字列の繰り返し)
    perl
    my $str1 = "Hello";
    my $str2 = "Perl";
    print $str1 . " " . $str2 . "\n"; # "Hello Perl"
    print "-" x 20 . "\n"; # "--------------------"
  • 比較演算子: Perlでは数値の比較と文字列の比較で異なる演算子を使います。これは非常に重要です。
意味 数値比較 文字列比較
等しい == eq
等しくない != ne
より大きい > gt
より小さい < lt
以上 >= ge
以下 <= le
```perl
print "5 == 5 is true\n"  if (5 == 5);     # true
print "'5' eq '5' is true\n" if ('5' eq '5'); # true
print "5 == '5.0' is true\n" if (5 == '5.0'); # true (数値として比較される)
print "'apple' gt 'banana' is false\n" unless ('apple' gt 'banana'); # 文字コード順で比較
```

2.3 制御構造

  • 条件分岐 (if/elsif/else):
    perl
    my $score = 85;
    if ($score >= 90) {
    print "Excellent\n";
    } elsif ($score >= 70) {
    print "Good\n";
    } else {
    print "Needs improvement\n";
    }

    unlessif notの糖衣構文です。unless ($score < 60) { ... }

  • 繰り返し (foreach/while):

    • foreach (または for) は、配列の各要素を順番に取り出して処理するのに便利です。
      perl
      my @colors = ("red", "green", "blue");
      foreach my $color (@colors) {
      print "Color is $color\n";
      }
    • whileは、条件が真である間、処理を繰り返します。
      perl
      my $i = 1;
      while ($i <= 5) {
      print "$i\n";
      $i++; # $i = $i + 1 と同じ
      }
  • ループ制御: next (C言語のcontinue相当), last (C言語のbreak相当)

2.4 入出力

  • 標準出力: print(改行なし)とsay(自動で改行)があります。sayを使うには、ファイルの先頭にuse feature 'say';またはuse v5.10;以上を記述する必要があります。
  • 標準入力: <STDIN>(または空の山括弧<>)で、ユーザーがキーボードから入力した一行を読み取ります。
    “`perl
    use strict;
    use warnings;
    use feature ‘say’;

    say “What’s your name?”;
    my $name = ;
    chomp($name); # 末尾の改行を削除するchomp()が必須
    say “Hello, $name!”;
    “`

演習問題1

  1. ユーザーに年齢を尋ね、その年齢が20歳以上か未満かで表示するメッセージを変えるプログラムを作成してください。
  2. 1から100までの数値のうち、3の倍数の時だけ「Fizz」、5の倍数の時だけ「Buzz」、両方の倍数の時に「FizzBuzz」、それ以外は数値を表示するプログラムを作成してください。

(解答例は記事の最後に記載します)


第3章: サブルーチンとスコープ (学習ロードマップ – Step 2)

コードが長くなってくると、同じような処理を何度も書くことになります。サブルーチン(他の言語でいう関数)は、処理をひとまとめにして名前をつけ、再利用可能にする仕組みです。

3.1 サブルーチンの定義と呼び出し

サブルーチンはsubキーワードで定義します。

“`perl
use strict;
use warnings;
use feature ‘say’;

サブルーチンの定義

sub greet {
say “Hello from a subroutine!”;
}

サブルーチンの呼び出し

greet(); # “Hello from a subroutine!”と表示
“`

引数と戻り値:

サブルーチンは引数を受け取って処理を行い、結果を返す(戻り値)ことができます。

  • 引数の受け取り: 引数は、特殊な配列@_に格納されます。
  • 戻り値: returnキーワードで値を返します。returnが省略された場合は、最後に評価された式の値が返されます。

“`perl
use strict;
use warnings;
use feature ‘say’;

sub add {
my ($num1, $num2) = @_; # @_から引数を取り出してmy変数に代入するのが定石
my $result = $num1 + $num2;
return $result;
}

my $sum = add(10, 20); # サブルーチンを呼び出し、戻り値を受け取る
say “10 + 20 = $sum”; # “10 + 20 = 30”
“`

3.2 変数のスコープ

スコープとは、変数が有効な範囲のことです。Perlではmyを使って宣言された変数が最も一般的で安全です。

  • my(レキシカルスコープ): myで宣言された変数は、その変数が宣言されたブロック({}で囲まれた範囲)の中だけで有効です。ブロックを抜けると変数は破棄されます。常にmyを使いましょう。

    “`perl
    use strict;
    use warnings;
    use feature ‘say’;

    my $x = 10; # グローバルなスコープの$x

    sub some_sub {
    my $x = 20; # サブルーチン内のローカルな$x
    say “Inside sub: x = $x”; # 20と表示
    }

    some_sub();
    say “Outside sub: x = $x”; # 10と表示(サブルーチン内の$xの影響を受けない)
    “`

  • our, local: これらは古い形式の変数スコープで、特殊な状況以外では使いません。初心者のうちはmyだけ覚えておけば十分です。

演習問題2

  1. 文字列と数値を引数として受け取り、その文字列を指定された回数だけ繰り返して連結した文字列を返すサブルーチンrepeat_stringを作成してください。(例: repeat_string("abc", 3)"abcabcabc"を返す)
  2. 数値の配列を引数として受け取り、その中の偶数だけを抽出した新しい配列を返すサブルーチンget_even_numbersを作成してください。

(解答例は記事の最後に記載します)


第4章: リファレンスとデータ構造 (中級へのステップアップ – Step 3)

Perlでより複雑なデータを扱うためには、「リファレンス」の理解が不可欠です。リファレンスは、変数や値がメモリ上のどこにあるかを示す「住所」のようなものです。

4.1 リファレンスとは何か?

なぜリファレンスが必要なのでしょうか?

  • サブルーチンに配列やハッシュを渡す: Perlのサブルーチンは、引数を一つの平坦なリスト(@_)として受け取ります。add_arrays(\@a, \@b)のように2つの配列を渡そうとすると、(@a, @b)という一つの大きなリストになってしまい、区別できません。リファレンスを使えば、配列そのものではなく「配列への住所」を渡すため、複数のデータ構造を正しく渡せます。
  • 複雑なデータ構造の作成: 「配列の配列(多次元配列)」や「ハッシュの配列」など、入れ子になったデータ構造を作るにはリファレンスが必須です。

リファレンスの作成 (\): 変数や値の前にバックスラッシュ\を付けます。

“`perl
my @array = (1, 2, 3);
my $array_ref = \@array; # 配列@arrayへのリファレンス

my %hash = (a => 1, b => 2);
my $hash_ref = \%hash; # ハッシュ%hashへのリファレンス

my $scalar = 10;
my $scalar_ref = \$scalar; # スカラー$scalarへのリファレンス
“`

デリファレンス(リファレンスから元の値を取り出す):

リファレンスが指し示す先の値にアクセスすることをデリファレンスと呼びます。

“`perl

配列リファレンスからのデリファレンス

my @original_array = @{$array_ref}; # 配列全体
my $first_element = ${$array_ref}[0]; # 個々の要素

-> (アロー演算子) を使ったより簡単な記法

my $first_element_arrow = $array_ref->[0]; # 上と同じ意味。こちらが一般的。

ハッシュリファレンスからのデリファレンス

my %original_hash = %{$hash_ref}; # ハッシュ全体
my $value_a = ${$hash_ref}{‘a’};

-> を使った記法

my $value_a_arrow = $hash_ref->{‘a’}; # こちらが一般的。
“`

4.2 複雑なデータ構造の作成

リファレンスを使うことで、複雑なデータ構造を簡潔に定義できます。

  • 無名配列リファレンス ([ ... ]):
    perl
    my $array_ref = [10, 20, 30]; # `my @a=(10,20,30); \@a` とほぼ同じ
    say $array_ref->[1]; # 20
  • 無名ハッシュリファレンス ({ ... }):
    perl
    my $hash_ref = { name => 'Hanako', age => 28 };
    say $hash_ref->{name}; # Hanako
  • 配列の配列(多次元配列):
    perl
    my $matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
    ];
    say $matrix->[1]->[2]; # 6 (2行目3列目の要素)
  • ハッシュの配列:
    perl
    my $users = [
    { id => 1, name => 'Alice' },
    { id => 2, name => 'Bob' },
    ];
    say $users->[0]->{name}; # Alice

4.3 データの可視化 (Data::Dumper)

複雑なデータ構造は、中身がどうなっているか確認するのが困難です。そんな時に役立つのがData::Dumperモジュールです。これはPerlに標準で付属しています。

“`perl
use strict;
use warnings;
use feature ‘say’;
use Data::Dumper;

my $data = [
{ id => 1, name => ‘Alice’, tags => [‘perl’, ‘web’] },
{ id => 2, name => ‘Bob’, tags => [‘python’, ‘data’] },
];

print Dumper($data);
“`

出力結果:

$VAR1 = [
{
'tags' => [
'perl',
'web'
],
'id' => 1,
'name' => 'Alice'
},
{
'tags' => [
'python',
'data'
],
'id' => 2,
'name' => 'Bob'
}
];

このように、データ構造がわかりやすく表示され、デバッグに非常に役立ちます。

演習問題3

書籍の情報を格納するデータ構造を作成してください。各書籍はハッシュリファレンスで、title (タイトル), author (著者), pages (ページ数) のキーを持つものとします。これらの書籍データを配列リファレンスに格納し、ループを使ってすべての書籍のタイトルと著者名を表示するプログラムを作成してください。

(解答例は記事の最後に記載します)


第5章: 正規表現 – Perlの真骨頂 (中級へのステップアップ – Step 4)

Perlが「テキスト処理の瑞士アーミーナイフ」と呼ばれる所以、それが正規表現です。正規表現は、文字列の中から特定のパターンを持つ部分を見つけ出したり、置き換えたりするためのミニ言語です。

5.1 正規表現の基本

Perlには正規表現のための演算子が組み込まれています。

  • マッチ演算子 (m//): 文字列がパターンに一致するかどうかを調べます。
    perl
    my $text = "Hello Perl World";
    if ($text =~ m/Perl/) { # `=~` は束縛演算子。左辺の文字列に右辺の正規表現を適用する
    print "Found Perl!\n";
    }
    # m// の m は省略可能
    if ($text =~ /World/) {
    print "Found World!\n";
    }
  • 置換演算子 (s///): パターンに一致した部分を別の文字列に置き換えます。
    perl
    my $text = "I love Python.";
    $text =~ s/Python/Perl/;
    print "$text\n"; # "I love Perl."

5.2 メタ文字と量指定子

正規表現は、特殊な意味を持つ「メタ文字」を組み合わせてパターンを記述します。

メタ文字 意味
. 任意の1文字(改行を除く) a.cabc, axc にマッチ
^ 行の先頭 ^AAppleA にマッチ
$ 行の末尾 d$endd にマッチ
* 直前の文字の0回以上の繰り返し go*lgl, gol, gool にマッチ
+ 直前の文字の1回以上の繰り返し go+lgol, gool にマッチ
? 直前の文字の0回または1回の繰り返し colou?rcolor, colour にマッチ
[] 角括弧内のいずれか1文字(文字クラス) [abc]a, b, c のいずれか
() グループ化 (ab)+ab, abab にマッチ
| いずれかにマッチ(OR条件) cat|dogcat または dog
\d 数字 ([0-9])
\w 英数字とアンダースコア ([a-zA-Z0-9_])
\s 空白文字(スペース、タブ、改行など)

5.3 キャプチャと後方参照

正規表現パターンの中で()で囲んだ部分は「キャプチャ」され、特殊変数 $1, $2, … に格納されます。

“`perl
my $log_line = “2023-10-27 INFO: Processing user_id=123.”;

if ($log_line =~ /(\d{4}-\d{2}-\d{2}) (\w+): .*user_id=(\d+)/) {
my $date = $1; # 2023-10-27
my $level = $2; # INFO
my $user_id = $3; # 123
print “Date: $date, Level: $level, UserID: $user_id\n”;
}

\d{4} は数字が4回繰り返すことを意味する

“`

5.4 便利なオプション(修飾子)

正規表現の末尾に付けることで、動作を変更できます。

  • /i: 大文字・小文字を区別しない。
  • /g: グローバル。文字列全体を検索し、一致するすべての箇所で置換やマッチを行う。
  • /s: .が改行文字にもマッチするようになる。
  • /x: パターン中の空白文字を無視し、コメント(#以降)を書けるようにする。複雑な正規表現を読みやすくするのに役立つ。

“`perl
my $html = “

Title

text

“;

/g修飾子で全てのタグを抽出

my @tags = $html =~ m/<(\w+)>/g; # @tags は (‘body’, ‘h1’, ‘p’, ‘body’) となる

/x修飾子で読みやすく書く

my $email_regex = qr/
( [a-zA-Z0-9._%+-]+ ) # ユーザー名
@
( [a-zA-Z0-9.-]+ ) # ドメイン名
.
( [a-zA-Z]{2,} ) # TLD
/x;

qr// は正規表現をコンパイルして変数に格納する演算子

my $email = ‘[email protected]’;
if ($email =~ $email_regex) {
print “Valid email: User=$1, Domain=$2, TLD=$3\n”;
}
“`

演習問題4

  1. 与えられた複数行のテキストの中から、http:// または https:// で始まるURLをすべて抽出して表示するプログラムを作成してください。
  2. "last_name, first_name" という形式の文字列を "first_name last_name" という形式に変換するプログラムを、正規表現のキャプチャと置換を使って作成してください。

(解答例は記事の最後に記載します)


第6章: モジュールとCPAN – Perlエコシステムの活用 (実践レベルへ – Step 5)

Perlの本当の力は、その広大なモジュールエコシステムにあります。CPAN (Comprehensive Perl Archive Network) は、世界中の開発者が作成した再利用可能なPerlモジュール(ライブラリ)の集積所です。

6.1 モジュールとは?

モジュールは、特定の機能を提供するPerlコードの集まりです。例えば、JSONデータを扱うためのモジュール、データベースに接続するためのモジュール、HTTPリクエストを送信するためのモジュールなどがあります。

モジュールを使うには、スクリプトの先頭でuseキーワードを使って読み込みます。

perl
use JSON; # JSONモジュールを読み込む

6.2 CPANとモジュールのインストール

CPANには20万以上のモジュールがあり、metacpan.org というサイトで検索できます。

モジュールのインストールにはcpanm (cpanminus) というツールを使うのが最も簡単で現代的です。

cpanmのインストール:

plenvでPerlをインストールした場合、cpanmはすでにインストールされていることが多いです。もしなければ、ターミナルで以下のコマンドを実行します。

“`bash

plenv環境の場合

cpan App::cpanminus

または、curlを使う方法

curl -L https://cpanmin.us | perl – –sudo App::cpanminus
“`

cpanmを使ったモジュールのインストール:

cpanm <モジュール名> でインストールします。例えば、モダンなファイル操作モジュールPath::Tinyをインストールするには:

bash
cpanm Path::Tiny

6.3 よく使う便利なモジュール紹介

  • Path::Tiny: ファイルやディレクトリの操作を直感的かつ安全に行えるモジュール。
  • JSON::PP (コアモジュール) / JSON::XS (高速): JSONデータのエンコード・デコード。
  • Time::Piece (コアモジュール): 日時のパースやフォーマットを簡単に行える。
  • HTTP::Tiny (コアモジュール) / LWP::UserAgent: Webサイトから情報を取得する(スクレイピングなど)。
  • DBIDBD::* (例: DBD::SQLite): データベースに接続するための標準的なインターフェース。
  • Try::Tiny: 安全な例外処理(try/catch構文)を提供。

モジュールを使った実践例(Path::TinyJSON::PP):

“`perl
use strict;
use warnings;
use feature ‘say’;

use Path::Tiny;
use JSON::PP;

1. データ構造を作成

my $data = {
project => ‘Perl Guide’,
version => 1.0,
modules => [‘Path::Tiny’, ‘JSON::PP’],
};

2. JSON::PPを使ってJSON文字列に変換

my $json_text = JSON::PP->new->pretty->encode($data);

3. Path::Tinyを使ってファイルに書き込む

my $file = path(‘data.json’);
$file->spew_utf8($json_text);

say “Wrote data to $file”;

4. ファイルから読み込んでデータ構造に復元

my $read_json = $file->slurp_utf8;
my $decoded_data = JSON::PP->new->decode($read_json);

say “Read project name: ” . $decoded_data->{project};
“`

演習問題5

  1. HTTP::Tinyを使って、指定したURL(例: https://www.example.com)のHTMLコンテンツを取得し、その文字数を表示するプログラムを作成してください。
  2. Path::Tinyを使って、カレントディレクトリにlogsというディレクトリを作成し、その中に現在の日時をファイル名にした(例: 20231027_153000.log)空のログファイルを作成するプログラムを作成してください。(日時の取得にはTime::Pieceが便利です)

(解答例は記事の最後に記載します)


第7章: モダンPerlへの道

Perlは進化を続けています。ここでは、現代的なPerl開発で知っておくと良いトピックをいくつか紹介します。

  • オブジェクト指向 (Moo/Moose): Perlにはblessを使った伝統的なオブジェクト指向がありますが、より現代的で強力なMooMooseといったモジュールを使うのが一般的です。これらは属性の定義、型制約、ロール(トレイト)などの機能を提供します。
  • 例外処理 (Try::Tiny): evalブロックと$@を使った伝統的なエラー処理よりも、Try::Tinyモジュールを使ったtry/catch構文の方が直感的で安全です。
  • テスト (Test::More): Perlには強力なテスト文化があります。Test::Moreモジュールを使えば、ok()is()といった簡単な関数でコードの正しさを検証するテストを記述できます。
  • Webフレームワーク (Mojolicious, Dancer2): PerlでWebアプリケーションを開発するためのモダンなフレームワークです。リアルタイムWeb機能や非同期処理に強いMojolicious、シンプルで手軽に始められるDancer2などがあります。

これらのトピックは、あなたがPerlの基礎を固めた後の、次なるステップとなるでしょう。

今後の学習のために:

  • 書籍: 『プログラミングPerl』(らくだ本)、『モダンPerl入門』、『Effective Perl』
  • Webサイト: Perl-users.jp (日本のPerlコミュニティ)、Perl Zine (Webマガジン)、blogs.perl.org
  • コミュニティ: YAPC::Japan (日本最大のPerlカンファレンス) などに参加してみるのも良いでしょう。

まとめ

この長いガイドを最後までお読みいただき、ありがとうございます。私たちは、Perlとは何かという問いから始め、インストール、基本文法、サブルーチン、リファレンス、正規表現、そしてCPANモジュールの活用まで、一通りの学習ロードマップを旅してきました。

  1. Step 1: 基本文法(変数、制御構造)をマスターする。
  2. Step 2: 処理をまとめるサブルーチンを使いこなす。
  3. Step 3: リファレンスを理解し、複雑なデータ構造を扱えるようになる。
  4. Step 4: Perlの強みである正規表現でテキストを自在に操る。
  5. Step 5: CPANモジュールを活用し、実践的なツール開発を始める。

Perlは、学び始めは少し変わっていると感じるかもしれませんが、一度その強力さと柔軟性を知れば、手放せないツールになります。この記事が、あなたのPerl学習の確かな一歩となったことを願っています。

There’s More Than One Way To Do It. あなた自身のやり方で、Perlの世界を存分に楽しんでください。Happy Hacking!


演習問題 解答例

演習問題1 解答例

  1. 年齢判定プログラム
    “`perl
    use strict;
    use warnings;
    use feature ‘say’;

    say “あなたの年齢を入力してください:”;
    my $age = ;
    chomp($age);

    if ($age >= 20) {
    say “あなたは成人です。”;
    } else {
    say “あなたは未成年です。”;
    }
    2. **FizzBuzzプログラム**perl
    use strict;
    use warnings;
    use feature ‘say’;

    foreach my $i (1..100) {
    if ($i % 15 == 0) {
    say “FizzBuzz”;
    } elsif ($i % 3 == 0) {
    say “Fizz”;
    } elsif ($i % 5 == 0) {
    say “Buzz”;
    } else {
    say $i;
    }
    }
    “`

演習問題2 解答例

  1. repeat_stringサブルーチン
    “`perl
    use strict;
    use warnings;
    use feature ‘say’;

    sub repeat_string {
    my ($str, $count) = @_;
    return $str x $count;
    }

    my $result = repeat_string(“nya”, 5);
    say $result; # “nyanyanyanya”
    2. **`get_even_numbers`サブルーチン**perl
    use strict;
    use warnings;
    use Data::Dumper;

    sub get_even_numbers {
    my @numbers = @_;
    my @even_numbers;
    foreach my $num (@numbers) {
    if ($num % 2 == 0) {
    push @even_numbers, $num; # 配列の末尾に要素を追加
    }
    }
    return @even_numbers;
    }

    my @list = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
    my @evens = get_even_numbers(@list);
    print Dumper(\@evens); # [2, 4, 6, 8, 10] を表示
    “`

演習問題3 解答例

“`perl
use strict;
use warnings;
use feature ‘say’;

my $books = [
{
title => ‘プログラミングPerl’,
author => ‘Larry Wall’,
pages => 1200,
},
{
title => ‘モダンPerl入門’,
author => ‘lestrrat’,
pages => 300,
},
{
title => ‘銀河英雄伝説’,
author => ‘田中芳樹’,
pages => 500,
},
];

foreach my $book (@{$books}) {
say “Title: ” . $book->{title};
say “Author: ” . $book->{author};
say “—“;
}
“`

演習問題4 解答例

  1. URL抽出プログラム
    “`perl
    use strict;
    use warnings;
    use feature ‘say’;

    my $text = <<‘END_TEXT’;
    これはサンプルテキストです。
    公式サイトは https://www.perl.org/ です。
    古いサイトは http://www.perl.com/ でした。
    FTPは ftp://example.com なので対象外です。
    END_TEXT

    my @urls = $text =~ m{(https?://[\w.-/\?=&]+)}g;

    say “見つかったURL:”;
    foreach my $url (@urls) {
    say $url;
    }
    2. **姓名変換プログラム**perl
    use strict;
    use warnings;
    use feature ‘say’;

    my $name = “Yazawa, Eikichi”;
    $name =~ s/(\w+), (\w+)/$2 $1/;
    say $name; # “Eikichi Yazawa”
    “`

演習問題5 解答例

  1. HTTP::Tiny利用プログラム
    “`perl
    # 必要なら cpanm HTTP::Tiny でインストール
    use strict;
    use warnings;
    use feature ‘say’;
    use HTTP::Tiny;

    my $url = ‘https://www.example.com’;
    my $response = HTTP::Tiny->new->get($url);

    if ($response->{success}) {
    my $content_length = length($response->{content});
    say “URL: $url”;
    say “Status: $response->{status}”;
    say “Content length: $content_length bytes”;
    } else {
    say “Failed to get $url: $response->{status} $response->{reason}”;
    }
    2. **`Path::Tiny`と`Time::Piece`利用プログラム**perl

    必要なら cpanm Path::Tiny Time::Piece でインストール

    use strict;
    use warnings;
    use feature ‘say’;
    use Path::Tiny;
    use Time::Piece; # コアモジュール

    ログディレクトリを作成(存在していてもエラーにならない)

    my $log_dir = path(‘logs’);
    $log_dir->mkpath;

    現在日時からファイル名を生成

    my $t = localtime; # Time::Pieceオブジェクト
    my $filename = $t->strftime(‘%Y%m%d_%H%M%S’) . ‘.log’; # YYYYMMDD_HHMMSS.log

    ファイルパスを結合して空ファイルを作成

    my $log_file = $log_dir->child($filename);
    $log_file->touch;

    say “Created log file: $log_file”;
    “`

コメントする

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

上部へスクロール