WHAT'S NEW
- 2024/07/19 Yet Another Perl Problems の CSS を変更
- 2024/07/19 お気楽 Perl プログラミング超入門の CSS を修正
CONTENTS
お気楽 Perl プログラミング超入門と Yet Another Perl Problems のフォントを Web フォント (Noto Sans JP, Noto Sans Mono) に変更し、印刷用の CSS を追加しました。Web ブラウザの印刷機能を使って PDF に変換することもできます。表示が崩れるときはフォント Noto Sans Mono CJK JP をインストールしてください。
お気楽 Perl プログラミング超入門
- 2023/03/19 Perl の基礎知識 (前編)
スカラーと変数、条件分岐、比較演算子、論理演算子、三項演算子、while 文と行入力演算子、use strict と use warnings、ファイルハンドル、文字列の変数展開
- 2023/03/19 Perl の基礎知識 (後編)
配列、連想配列、配列とリスト、コンテキスト、for 文、foreach 文、繰り返しの制御、範囲演算子、配列の便利な使い方、コマンドライン引数の取得、2 つのファイルを行単位で連結する、プログラムの作成
- 2023/03/19 正規表現 (前編)
正規表現の基礎知識、Perl の正規表現、文字列の検索、クロスリファレンスの作成、連想配列の操作関数、行番号の表示、プログラムの作成、簡単な実行例
- 2023/03/19 正規表現 (後編)
後方参照、文字列の置換、タブを空白に展開する、空白をタブに置換する、文字の置換、正規表現で日本語を使う場合
- 2023/03/19 関数
関数の定義方法、関数に配列を渡す、関数の返り値、大域変数と局所変数、局所変数の定義、マスターマインド、乱数、乱数の生成、数字を決める、入力処理を作る、bulls と cows を数える、ゲーム本体を作る、実行例
- 2023/03/19 再帰定義
再帰定義の基本、再帰定義のポイント、ユークリッドの互除法、累乗の計算、末尾再帰と繰り返し、バックトラック法と再帰定義、順列の生成、ハノイの塔
- 2023/03/19 リファレンス (前編)
メモリの構成、C言語のポインタ、リファレンスとは?、配列へのリファレンス、連想配列へのリファレンス、データの探索、無名の配列、クロスリファレンスの改良
- 2023/03/19 リファレンス (後編)
無名のハッシュ、関数へのリファレンス、無名の関数、高階関数、grep、map、sort、他段階のリファレンス、多次元配列と矢印演算子、ファイルからデータを読み込む、二次元配列の表示、値呼びと参照呼び、Perl の関数は参照呼び
- 2023/03/19 クロージャ
クロージャとは?、my と local の違い、ジェネレータ、コールバック関数とクロージャ、高階関数とクロージャ、マッピング、フィルター、畳み込み、実行例 (1)、実行例 (2)
- 2023/03/19 経路の探索
グラフ、隣接行列と隣接リスト、バックトラックによる探索、プログラムの作成、実行結果、幅優先探索、経路の管理、プログラムの作成 (2)、実行結果 (2)、反復深化、プログラムの作成 (3)、実行結果 (3)
- 2023/03/19 オブジェクト指向 (前編)
オブジェクト指向とは?、クラスとインスタンス、メソッド、継承、Perl のオブジェクト指向、パッケージとは?、クラスの定義とインスタンスの生成、メソッドの呼び出し、クラスメソッドの呼び出し
- 2023/03/19 連結リスト
連結リストとは?、セルの定義、作業用メソッド nth_cell、連結リストの定義、データの参照、データの更新、データの挿入、データの削除、高階関数 each、連結リストの表示、簡単なテスト
- 2023/03/19 順列と組み合わせ
順列の生成、順列を配列に生成する、配列から m 個の要素を選ぶ順列、組み合わせの生成、組み合わせを配列に格納する、配列から n 個の要素を選ぶ組み合わせ
- 2023/03/19 二分探索木
木構造、二分木、節の定義、節のアクセスメソッド、データの探索、データの挿入、データの削除、最小値の探索と削除、データ削除のプログラム、巡回 (traverse)、クラス Tree とメソッドの定義、簡単なテスト
- 2023/03/19 オブジェクト指向 (後編)
継承、継承の仕組み、単一継承、擬似クラス SUPER、制限付き連結リスト、多重継承、多重継承の問題点、Mix-in、Enumerable、Perl の goto、Enumerable を Mix-in する、間接記法
- 2023/03/19 パズルの解法
8 クイーン、単純な生成検定法、実行結果、プログラムの高速化、実行結果 (2)、騎士の巡歴、盤面の定義、プログラムの作成、実行結果、マスターマインド、推測アルゴリズム、プログラムの作成、何回で当たるか
- 2023/03/21 パズルの解法 (2)
パズルの説明 (8 パズル)、盤面の定義、駒の移動、移動手順の管理、幅優先探索のプログラム、実行結果、双方向探索、実行結果 (2)、最長手数の求め方、リングバッファ、プログラムの作成、実行結果 (3)
- 2023/03/21 パズルの解法 (3)
ペグ・ソリテア、Hoppers、跳び先表とペグの移動、反復深化による Hoppers の解法、実行結果、反復深化による 8 パズルの解法、実行結果、下限値枝刈り法、プログラムの作成、実行結果 (2)
- 2023/03/21 パッケージ
BEGIN と END、オートロード、オブジェクトの廃棄、名前のインポート、use と require の違い、型グロブ、シンボルテーブル、パッケージ中のシンボルを求める
- 2023/03/21 整数の論理演算とビット操作
integer プラグマ、ビット演算子、組み合わせの生成、組み合わせに番号を付ける方法、組み合わせを番号に変換、番号を組み合わせに変換、ちょっと便利なビット操作、ビットが 1 の個数を求める
- 2023/03/21 メモ化と遅延評価
たらいまわし関数、メモ化による高速化、Memoize によるメモ化、遅延評価による高速化
- 2023/03/21 eval と例外処理
eval の使い方、パズル 小町算、例外処理、大域脱出、パズル Four Fours、数式のパターン、プログラムの作成、実行結果
- 2023/03/26 Perl の便利な機能
ヒアドキュメント、フォーマット、ヘッダの出力、pack と unpack、テキストモードとバイナリモード、バイナリデータの操作、ファイルのダンプ
はじめに
Perl は 1987 年に Larry Wall 氏が awk, C言語, csh の良いところを引き継いで作成したスクリプト言語です。Larry Wall 氏によると、Perl は "Practical Extraction and Report Language" 「実用データ取得レポート作成言語」 のことだそうです。名前の由来からわかるように、Perl は大量のデータから必要なデータを取り出し、それを加工して出力することが得意な言語です。
もともとスクリプト言語というのは、テキストファイルを処理するためのインタプリタ型言語のことです。Unix 系の OS では awk が元祖といえます。Perl と awk を比べてみると、Perl には次のような特徴があります。
- 文字列処理が強力で柔軟性がある
- UNIX のシステムコールが組み込み関数として用意されているため、ファイル処理やプロセス処理が簡単に実行できる
- 実行速度が awk よりも速い
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
- 実行環境 : Ubunts 22.04 LTS (WSL2, Windows 10), Intel Core i5-6200U 2.30GHz
Perl は Python や Ruby よりも古い言語で、実行時間が後発の言語よりも遅くなるのは仕方がないところでしょう。興味のある方はいろいろ試してみてください。
Yet Another Perl Problems
Yet Another Perl Problems は M.Hiroi が Perl の勉強で作成した簡単なプログラムをまとめたものです。拙作のページ Yet Another Clang Problems や Yet Another Golng Problems などの Perl バージョンになります。同じような問題が多くなると思いますが、あしからずご了承くださいませ。
- 2023/03/25 問題 1 - 10, 解答 1 - 10
九九表、整数の和、累乗、フィボナッチ関数、整数の n 進数表示、組み合わせの数、順列の生成、重複順列の生成、組み合わせの生成、重複組み合わせの生成
- 2023/03/25 問題 11 - 20, 解答 11 - 20
度数分布表と累積度数表、平均値と標準偏差、最大値と最小値、線形探索、素因数分解、めのこ平方、バイナリサーチ、バブルソート、選択ソート、挿入ソート
- 2023/03/25 問題 21 - 30, 解答 21 - 30
重複要素の削除、集合演算、シェルソート、クイックソート、素因数分解、約数の個数、約数の合計値、約数、完全数、友愛数
- 2023/03/25 問題 31 - 40, 解答 31 - 40
完全順列、モンモール数、カッコ列の生成、カッコ列の総数 (カタラン数)、分割数、整数の分割、集合の分割、ベル数、集合のグループ分け、グループ分けの個数
参考文献・URL
- 増井俊之,『Perl書法』, アスキー, 1993
- Larry Wall, Tom Christiansen, Randal L. Schwartz,『プログラミング Perl 改訂版』, オライリー・ジャパン, 1997
- Sriram Srinivasan, 『実用Perlプログラミング』, オライリー・ジャパン, 1998
- perldoc.jp, Perl の公式ドキュメント、モジュールドキュメントを日本語に翻訳したサイト
- Perl 入門 (全19回), ドットインストール
権利・免責事項など
『お気楽 Perl プログラミング超入門』の著作権は筆者「広井誠 (Makoto Hiroi)」が保持します。無断使用や無断転載は禁止いたします。『お気楽 Perl プログラミング超入門』で作成したプログラムはフリーソフトウェアとします。ご自由にお使いください。プログラムの改造や配布もご自由にどうぞ。その際は、出典を明記してくださるようお願いいたします。
ただし、本ページの内容とプログラムは無保証であり、利用したことにより生じた損害について、作者「広井誠 (Makoto Hiroi)」 は一切の責任を負いません。また、これらのプログラムを販売することで利益を得るといった商行為は禁止いたします。
Copyright (C) 2015-2024 Makoto Hiroi
All rights reserved.