Perl/はじめに
TMTOWTDI
[編集]Perl(パール)とは、1987年にラリー・ウォールが開発したプログラミング言語です。PerlはC言語をはじめ、AWKやsedのような様々なUNIXのソフトウェアの伝統を受け継ぎ、多くの優れた機能を取り入れています。
PerlのモットーはThere's More Than One Way To Do It.(やり方は何通りもある)で、略してTMTOWTDI(ティムトゥディ)などと呼ばれます。これは「正しいやり方がいくつ存在してもよい」という考え方で、Perlの柔軟性を表しています。このことから、Perlは特にテキスト処理やCGIプログラミングの分野で多く用いられています。
PerlはC言語と比べて簡潔であり、移植性が高い言語です。C言語では数百行のプログラムが必要な場合でも、Perlでは数行で書くことができることもあります。
一方で、Perlの文法は省略を多用したり、特殊変数を記号で表すことがありますので、Perlのやり方に慣れるまでには少し時間がかかるかもしれません。しかし、一行でも多くのコードを書いてPerlを身につけることをお勧めします。
前提条件
[編集]テキストエディタを用いて例に挙げられる通りのファイルを作成できることを前提としています。プログラミングそのものの概念についてはプログラミング(Wikibooks)やプログラミング(Wikipedia)を参照してください。以降、断りのない場合はUnix(およびLinuxなどのUnix互換OS)上で Perl 5.30.0(2019年05月22日 リリース)以降のバージョンを利用しているものとして説明します(かつて Perl6 と呼ばれていた Raku は含みません)。
実行環境
[編集]Microsoft Windows
[編集]Perl公式サイトではWindowsに対応したパッケージは提供していません。 このため、サードパーティーが提供するPerlのディストリビューションを利用するか、Cygwin・MSYS2やWindows Subsystem for Linuxを利用する方法もあります。
Strawberry Perl
[編集]Strawberry Perlは、Microsoft Windowsプラットフォーム用のプログラミング言語Perlのディストリビューションです。 Strawberry Perlには、Mingw-w64 C/C++コンパイラなどのツールチェインが含まれています。 Strawberry Perlは、環境変数はインストール時に設定済みなので、インストール直後に、コマンド プロンプト・Power shellあるいは、Windows Terminalから使うことができます。
- 2024年6月現在、Strawberry PerlのPerlコアはv5.38.2.2(2023/12/11リリース)です。
- Strawberry Perl for Windows
macOS, FreeBSD, その他 UNIX 環境
[編集]maxOS, FreeBSD, その他 UNIX 環境ではほとんどの場合、PerlはOSのユーザーランドとは別にパッケージとして提供されています。「ターミナル」を起動し、コマンドプロンプト($
, %
, >
などの記号)に続けてperl -v
と入力し、⏎([Enter]または[Return])キーを押し、以下のように表示されればperlが利用可能です。
% perl -v This is perl 5, version 40, subversion 0 (v5.40.0) built for amd64-freebsd-thread-multi Copyright 1987-2024, Larry Wall Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit. Complete documentation for Perl, including FAQ lists, should be found on this system using "man perl" or "perldoc perl". If you have access to the Internet, point your browser at https://www.perl.org/, the Perl Home Page. % _
PerlがインストールされていないUNIX環境
[編集]主要なUNIXならは、Perlをサポートしていると思いますが、もしOSの公式パッケージにperlが無い場合でも、 Perl Download - www.perl.orgからバイナリパッケージをダウンロードできます。
バイナリパッケージが存在しないプラットフォームの場合はPerl Download - www.perl.orgからソースコードをダウンロードし、ビルドして実行してください。
GNU/Linux
[編集]GNU/Linux の場合、Linux Standard Base(LSB; ISO/IEC 23360:2021)では、準拠するすべてのディストリビューションにPerlをインストールして出荷することが義務付けられています[1]。 しかし、何らかの理由でインストールされていないディストリビューションでは、apt などのパッケージマネージャーを利用してインストールする必要があります。
詳細は、利用しているディストリビューションのパッケージマネージャーの利用法を確認してください。 また、既に Perl がインストールされている環境でも、最新のバージョンを維持するためにパッケージマネージャーを利用して update するよう心がけ、脆弱性があるまま使わないようにしましょう。
作成、実行の流れ
[編集]プログラムの作成
[編集]Perlはインタプリター言語です。つまり、プログラムを実行するたびに、コンパイル[2]と実行を行うPerlインタプリターが常に必要なのです。 C/C++やJavaのようにプログラムをコンパイルしてから実行するのではなく、プログラムのソースコードを(Perlインタプリターがある)別のコンピューターにコピーして実行するだけで良いのです。
ソースコードの編集には好きなテキストエディタを使うことができます。 OS標準のメモ帳(Windows)、TextEdit(macOS)、vi(UnixやUnix互換OS)などでも十分です。 Wordなどのワードプロセッサーでも編集は可能ですが、標準ではプレーンテキストとして保存されないので注意してください。
Perlで書かれたコードを実行したい場合には、テキストエディタで実行したいコードを書いてセーブ保存してから、コマンド端末から保存したファイルを perl で実行することになります。
デバッガー
[編集]Perlにも、Pythonの対話モードのような REPL( Read-Eval-Print Loop ) があります。
- デバッガーの起動例
% perl -de 1 Loading DB routines from perl5db.pl version 1.77 Editor support available. Enter h or 'h h' for help, or 'man perldebug' for more help. main::(-e:1): 1 DB<1> say 2**9 512 DB<2> say "Hello world!" Hello world! DB<3> q % _
- 短いコードの確認には、このデバッグモードが便利です。
プログラムの実行
[編集]テキストエディタでhello.pl
というソースファイルを下記のように作成し、
- hello.pl
#!/usr/bin/env perl use v5.30.0; say "Hello, World"; say "Hello, Perl";
- コマンドラインでの実行
% cat > hello.pl #!/usr/bin/env perl use v5.30.0; say "Hello, World"; say "Hello, Perl"; ^D % perl hello.pl Hello, World Hello, Perl % chmod +x hello.pl % ./hello.pl Hello, World Hello, Perl % _
- say は、文字列または文字列のリストを表示(して改行)する組込み関数です。
- Perlの文字列リテラルは、
"
(ダブルクォーテーションマーク)で囲みます。 ’
(シングルクオーテーション)で囲んで文字列リテラルを表現できますが、この場合は改行文字(\n
)などのバックスラッシュエスケープや変数($x
,@y
や%z
,)が展開されずそのまま表示されるなどの違いがあります。
Perlは、多くのプログラミング言語と同様に、Perlは構造化プログラミングというプログラミングパラダイムを採用しています。 プログラムの流れは逐次・分岐・反復の3つが基本です[3]。 つまり、原則としてプログラムはソースコードに記述された順に実行され、if や for などの制御構造があったときだけ分岐・反復します。
Perlの基本機能の紹介
[編集]変数の宣言と初期化
[編集]Perlでは、変数は「データを格納する領域(オブジェクト)に付けられた名前」です(動的型付け)。 Perlでは変数名(例ではx)の前に$, %, @などの接頭辞(sigil; シジル)がつく表現を変数として扱います。
- コード例(エラーとなります)
#!/usr/bin/env perl use v5.12; #use strict; v5.12以降は use strict を含んでいるので以後は略します use warnings; $x = "Perl"; say "Hello, $x";
- 実行結果
Global symbol "$x" requires explicit package name (did you forget to declare "my $x"?) at Main.pl line 6. Global symbol "$x" requires explicit package name (did you forget to declare "my $x"?) at Main.pl line 7. Execution of Main.pl aborted due to compilation errors.
- シバン(shebang!)で、スクリプトを実行するインタープリターの位置を教えます。
#!/usr/bin/perl
とする例を見かけますが、perl が /usr/bin/perl でなく他の場所(例えば /usr/local/bin/perl)にインストールされている可能性があるので#!/usr/bin/env perl
としました。これは、PATHが通ったディレクトリに perl と言う名前のトロージャンホースを仕掛けられるリスクがあるとの批判がありますが、$ perl hello.pl
するときにも同じリスクがあり、リスクゼロではありませんが受入れがたいものではないと考えられます。
- Perl v5.12 以降の機能を有効にしています。
- 安全ではない構文を制限する Perl プラグマ strict は Perl5.12 からディフォルトで有効です[4]。
- strict が有効なので、グローバル変数の使用はエラーとなります。
- 無効にするのは、 no strict; とします。
- 選択的な警告を調整する Perl warnings です[5]。
- これは、Perl5.36.0 以降でディフォルトで有効なので 5.36 より前のスクリプトでは、明示的に use warnings; が必要です。
この対策として、キーワード my
を使ってレキシカルスコープの変数(レキシカル変数)として宣言します。
- コード例(修正後)
#!/usr/bin/env perl use v5.12; # use strict; use warnings; my $x = "Perl"; say "Hello, $x";
- 実行結果
Hello, Perl
- 6行目を修正した結果、正しく実行できました。
- この様にに、
use v5.12;
以降を指定することで、 安全でないコードを早い段階で発見できます。
Perlでは例にあるような構造のない、ただ一つの値のみを保有するデータ(スカラーと呼びます)のほか、順番に並んだ複数のデータからなる配列、キーと値のペアー複数記録するハッシュ、より複雑なデータ構造を実現するリファレンスなどのデータを扱うことができます。 変数についての詳細は変数とデーター型で解説します。 リファレンスについての詳細はリファレンスで解説します。
式と演算子
[編集]Perlには、豊富な数値計算のための演算子が用意されており、それらを組み合わせて式を作ることが出来ます。
- コード例
#!/usr/bin/env perl use v5.12; use warnings; say 12 + 5; say 12 - 5; say 12 * 5; say 12 / 5; say 12 % 5; say 12 ** 5; say 12 & 5; say 12 | 5; say 12 ^ 5; say 12 << 1; say 12 >> 1; say -12; say +12;
- 実行結果
17 7 60 2.4 2 248832 4 13 9 24 6 -12 12
- 四則 徐 剰余 累乗 ビット間論理積 ビット間論理和 ビット間排他的論理和 右シフト 左シフト 単項マイナス 単項プラス です
use v5.12;のv5.12は、自分の使っているPERLインタープリターのバージョン(特殊変数 $^V で確認できます)で良いでしょう。
もし、指定しないと組込み関数のスペルミス程度でも、エラーも警告もなく思いもかけない結果になります。
- 修正例
$x = cyop; print $x
- 実行結果
cyop
use v5.12;
use warnings;
$x = cyop;
print $x
Global symbol "$x" requires explicit package name (did you forget to declare "my $x"?) at Main.pl line 4.
Global symbol "$x" requires explicit package name (did you forget to declare "my $x"?) at Main.pl line 5.
Bareword "cyop" not allowed while "strict subs" in use at Main.pl line 4.
Execution of Main.pl aborted due to compilation errors.
制御構造
[編集]原則としてPerlのプログラムは上に書かれているものから順に実行されていきますが、繰り返しや、特定の条件に応じて動作を切り替えることができます。
条件分岐
[編集]ある条件をみたしているか(ここでは$x が 3 より大きいかどうか)を判定し、判定の内容により動作を切り替えています。
- コード例
#!/usr/bin/env perl use v5.12; use warnings; my $x = 5; if ($x > 3){ say "$x > 3" } else { say "$x <= 3" }
- 実行結果
5 > 3
反復
[編集]反復は、あるブロックを繰り返す制御構造でループとも呼ばれます。
- コード例
#!/usr/bin/env perl use v5.12; use warnings; foreach my $num (1 .. 10) { print "$num "; } say ""
- 実行結果
1 2 3 4 5 6 7 8 9 10
コメント
[編集]プログラミングの作成中に「プログラム内にメモを残しておきたい」「一時的にある動作を実行されないようにしたい」といった要求が生じることがあります。このような「プログラミングのコードに記載されるが動作しない箇所」のことを一般にコメントと呼びます。
- コード例
#!/usr/bin/env perl use v5.12; use warnings; # シャープ以降から行末まで実行されない say "ここはコメントの外";
- 実行結果
ここはコメントの外
- Perlでは#以降の行端までがコメントとみなされます。C言語にあるような複数行にわたるコメントはありませんが、以下のような方法で実質的な複数行コメントを利用することができます。
Podによるドキュメンテーション
[編集]PerlのPodは、Plain Old Documentationの略で、Perlスクリプトのドキュメンテーションを書くためのフォーマットです。 Podは、テキストファイルに記述され、スクリプトと一緒に配布されることが一般的です。 Podは、人間が読みやすいドキュメントを作成するために設計されていますが、コンピュータプログラムにも解析可能な単純な構文があります。
以下はPerlで1から100の間の素数をすべて表示するプログラムにPodによるドキュメントも付加した例です。
#!/usr/bin/env perl use v5.12; use warnings; =head1 NAME find_primes.pl - Find all prime numbers between 1 and 100 =head1 SYNOPSIS perl find_primes.pl =head1 DESCRIPTION This program finds all prime numbers between 1 and 100 and prints them to the console. =head1 AUTHOR Your Name =cut # Initialize an array to hold the prime numbers my @primes = (); # Loop through all numbers between 1 and 100 for my $num (1..100) { my $is_prime = 1; # Check if the number is divisible by any number other than itself and 1 for my $divisor (2..int($num/2)) { if ($num % $divisor == 0) { $is_prime = 0; last; } } # If the number is prime, add it to the array push @primes, $num if $is_prime; } # Print the prime numbers to the console print "Prime numbers between 1 and 100:\n"; print join(", ", @primes) . "\n";
- HTMLのレンダリング例
<?xml version="1.0" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>find_primes.pl - Find all prime numbers between 1 and 100</title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <link rev="made" href="mailto:mat@FreeBSD.org" /> </head> <body> <ul id="index"> <li><a href="#NAME">NAME</a></li> <li><a href="#SYNOPSIS">SYNOPSIS</a></li> <li><a href="#DESCRIPTION">DESCRIPTION</a></li> <li><a href="#AUTHOR">AUTHOR</a></li> </ul> <h1 id="NAME">NAME</h1> <p>find_primes.pl - Find all prime numbers between 1 and 100</p> <h1 id="SYNOPSIS">SYNOPSIS</h1> <pre><code>perl find_primes.pl</code></pre> <h1 id="DESCRIPTION">DESCRIPTION</h1> <p> This program finds all prime numbers between 1 and 100 and prints them to the console. </p> <h1 id="AUTHOR">AUTHOR</h1> <p>Your Name</p> </body> </html>
上記の例では、=head1
はセクションの見出しを表します。
NAME
とSYNOPSIS
は、モジュールの名前と使用例を説明します。
DESCRIPTION
は、モジュールの機能の詳細な説明であり、AUTHOR
は、モジュールの作者の情報を提供します。
脚註
[編集]- ^
/usr/bin/perl
にPerlインタープリターも実行形式または実行形式へのリンクが有り ⇒ Linux Standard Base Languages Specification 5.0::7.2. Perl Interpreter Location、v5.8.8 以降であることが義務付けられています ⇒Linux Standard Base Languages Specification 5.0::7.3. Perl Interpreter Version。 - ^ Perlでコンパイルといった場合、Perlインタープリターがソースコードを読込み内部表現に置換えることです。これは移植性・相互運用性の視点からは好ましい特徴で、C/C++やJavaのように実行形式や中間表現をファイルに書出すことではありません。
- ^ gotoはあります。が、大域脱出などはラベルと併用したループ制御文で実現できるなど、gotoが必要になるケースは極めて少ないです
- ^ “strict - Perl pragma to restrict unsafe constructs - Perldoc Browser”. 2022年11月9日閲覧。
- ^ “warnings - Perl pragma to control optional warnings - Perldoc Browser”. 2021年12月11日閲覧。