M.Hiroi's Home Page

Linux Programming

お気楽 Perl プログラミング超入門

[ Home | Linux ]

WHAT'S NEW


CONTENTS


はじめに

Perl は 1987 年に Larry Wall 氏が awk, C言語, csh の良いところを引き継いで作成したスクリプト言語です。Larry Wall 氏によると、Perl は "Practical Extraction and Report Language" 「実用データ取得レポート作成言語」 のことだそうです。名前の由来からわかるように、Perl は大量のデータから必要なデータを取り出し、それを加工して出力することが得意な言語です。

もともとスクリプト言語というのは、テキストファイルを処理するためのインタプリタ型言語のことです。Unix 系の OS では awk が元祖といえます。Perl と awk を比べてみると、Perl には次のような特徴があります。

Perl が登場してからは、シェルスクリプトの中で sed や awk など各種ツールを組み合わせて実行した処理を、Perl だけで処理できるようになりました。その後、Perl はバージョンアップするたびにさまざまな機能を取り込み、汎用のプログラミング言語に成長しました。1990 年代の後半には CGI (Common Gateway Interface) 用の記述言語として大ブレークし、スクリプト言語の地位を確立しました。

いろいろな機能を取り込んだ結果、Perl は複雑な言語になってしまいましたが、けっして難しい言語ではありません。Perl はインタプリタ型言語なので、プログラムをすぐに実行できます。そして、簡単にプログラムが組めるように、いろいろな工夫が施されています。特に、テキストファイルを処理するプログラムは簡単です。たとえば、ファイルの内容を表示する cat は、たった 1 行で書くことができます。

リスト : cat.pl

#! /usr/bin/perl

while (<>) { print; }

これで、複数のファイルも表示できるのです。次のように実行してみてください。

$ chmod u+x cat.pl
$ ./cat.pl file1 file2 file3

これで file1 だけではなく、file2 とfile3 も表示されます。このような短いプログラムは、次のように実行することもできます。

$ perl -e 'while(<>){ print; }' file1 file2 file3

Perl は -e の直後にある引数をプログラムとして実行します。行番号をつける場合は次のようになります。

リスト : 行番号をつける

#! /usr/bin/perl

while (<>) { print "$.: $_"; }

とても簡単ですね。

もしも、あなたがC言語をご存知であれば、Perl のプログラムはC言語とよく似ていることに気がつくと思います。ですが、main() はありませんし、<> $. $_ といった見慣れない記号がありますね。アカデミックなプログラミング言語、たとえば Pascal などに比べると、C言語は記号的でよくわからない、という批判がありますが、Perl はC言語以上に記号的なのです。このことで Perl を好まない人達もいるのですが、「簡単な仕事は簡単にできる」ことが Perl のポリシーなので、プログラムも記号を多用したコンパクトな表現になっています。

このほかにも、Perl には手間をかけずにプログラムを作るための工夫が、いろいろと施されています。ほかのプログラマからみると、「何だこれは!」と驚くようなこともあるのですが、それも「簡単な仕事は簡単にできる」ためであれば Perl では許されるのです。

このように、強烈な個性を持つ Perl ですが、それに慣れるとプログラムは簡単に作れるようになる、といわれています。最近は Python, PHP, Ruby など新しいスクリプト言語が普及していて、Perl はちょっと古くさくなってきましたが、今でも現役のプログラミング言語です。本ページでは、簡単なプログラムを作りながら Perl の基本的な機能を一通り説明していきたいと思っております。たいしたことはできませんが、よろしければお付き合いくださいませ。

●たらいまわし関数

それでは、お馴染みの「たらいまわし関数」を使って、Perl の実行時間を計測してみましょう。参考のため、Python と Ruby の実行時間も計測しました。

リスト : たらいまわし関数 (tak.pl)

sub tak {
    my ($x, $y, $z) = @_;
    return $z if $x <= $y;
    &tak(&tak($x - 1, $y, $z), &tak($y - 1, $z, $x), &tak($z - 1, $x, $y));
}

print &tak(18, 9, 0);
リスト : たらいまわし関数 (tak.py)

def tak(x, y, z):
    if x <= y:
        return z
    else:
        return tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y))

print(tak(18, 9, 0))
リスト : たらいまわし関数 (tak.rb)

def tak(x, y, z)
  return z if x <= y
  tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y))
end

print tak(18, 9, 0)

時間計測はコマンド time を使います。time で時間を計測する場合、プログラムの起動時間も含まれることに注意してください。実行結果は次のようになりました。

  表 : 実行結果 (単位:秒)

               : tak(18,9,0)
---------------+------------
Perl v5.34.0   :   3.54
Python 3.10.6  :   1.53
Ruby 3.0.2p107 :   0.68

Perl は Python や Ruby よりも古い言語で、実行時間が後発の言語よりも遅くなるのは仕方がないところでしょう。興味のある方はいろいろ試してみてください。


Yet Another Perl Problems

Yet Another Perl Problems は M.Hiroi が Perl の勉強で作成した簡単なプログラムをまとめたものです。拙作のページ Yet Another Clang ProblemsYet Another Golng Problems などの Perl バージョンになります。同じような問題が多くなると思いますが、あしからずご了承くださいませ。

  1. 2023/03/25 問題 1 - 10, 解答 1 - 10
    九九表、整数の和、累乗、フィボナッチ関数、整数の n 進数表示、組み合わせの数、順列の生成、重複順列の生成、組み合わせの生成、重複組み合わせの生成
  2. 2023/03/25 問題 11 - 20, 解答 11 - 20
    度数分布表と累積度数表、平均値と標準偏差、最大値と最小値、線形探索、素因数分解、めのこ平方、バイナリサーチ、バブルソート、選択ソート、挿入ソート
  3. 2023/03/25 問題 21 - 30, 解答 21 - 30
    重複要素の削除、集合演算、シェルソート、クイックソート、素因数分解、約数の個数、約数の合計値、約数、完全数、友愛数
  4. 2023/03/25 問題 31 - 40, 解答 31 - 40
    完全順列、モンモール数、カッコ列の生成、カッコ列の総数 (カタラン数)、分割数、整数の分割、集合の分割、ベル数、集合のグループ分け、グループ分けの個数

参考文献・URL

  1. 増井俊之,『Perl書法』, アスキー, 1993
  2. Larry Wall, Tom Christiansen, Randal L. Schwartz,『プログラミング Perl 改訂版』, オライリー・ジャパン, 1997
  3. Sriram Srinivasan, 『実用Perlプログラミング』, オライリー・ジャパン, 1998
  4. perldoc.jp, Perl の公式ドキュメント、モジュールドキュメントを日本語に翻訳したサイト
  5. Perl 入門 (全19回), ドットインストール

『お気楽 Perl プログラミング超入門』の著作権は筆者「広井誠 (Makoto Hiroi)」が保持します。無断使用や無断転載は禁止いたします。『お気楽 Perl プログラミング超入門』で作成したプログラムはフリーソフトウェアとします。ご自由にお使いください。プログラムの改造や配布もご自由にどうぞ。その際は、出典を明記してくださるようお願いいたします。

ただし、本ページの内容とプログラムは無保証であり、利用したことにより生じた損害について、作者「広井誠 (Makoto Hiroi)」 は一切の責任を負いません。また、これらのプログラムを販売することで利益を得るといった商行為は禁止いたします。

Copyright (C) 2015-2023 Makoto Hiroi
All rights reserved.

[ Home | Linux ]