Perl/はじめに

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動
プログラミング > Perl > はじめに

TMTOWTDI[編集]

Perl(パール)とは、1987年ラリー・ウォールが開発したプログラミング言語です。PerlはC言語はもちろん、AWKsedのような様々なUNIXソフトウェアの伝統を受け継ぎ、多くの優れた機能を取り入れています。

PerlのモットーはThere's More Than One Way To Do It.(やり方は何通りもある)で、略してTMTOWTDI(ティムトゥディ)などと呼ばれます。これは「正しいやり方がいくつ存在してもよい」という考え方で、Perlの柔軟性を表しています。このことから、Perlは特にテキスト処理やCGIプログラミングの分野で多く用いられています。

PerlはC言語と比べて簡素であり、移植性が高い言語です。C言語では数百行で記述されるプログラムが、Perlでは数行で書けてしまうこともあります。

その一方で、省略を多用する文法や記号で表される特殊変数など、Perlのやり方に慣れるまでは少し時間がかかるかもしれません。一行でも多くコードを書き、Perlを身に付けましょう。

前提条件[編集]

テキストエディタを用いて例に挙げられる通りのファイルを作成できることを前提としています。プログラミングそのものの概念についてはプログラミング(Wikibooks)プログラミング(Wikipedia)を参照してください。以降、断りのない場合はUnix(およびLinuxなどのUnix互換OS)上で Perl 5.30.0(2019年05月22日 リリース)以降のバージョンを利用しているものとして説明します(かつて Perl6 と呼ばれていた Raku は含みません)。

実行環境[編集]

Microsoft Windows[編集]

Perl公式サイトではWindowsに対応したパッケージは提供していません。 このため、サードパーティーが提供するPerlのディストリビューションを利用するか、CygwinWindows Subsystem for Linuxを利用する方法もあります。

ActivePerl[編集]

Wikipedia
ウィキペディアActivePerlの記事があります。

ActivePerlは、ActiveState社(旧ソフォス社)が提供するWindows、macOS、Linux、Solaris、AIX、HP-UX向けのPerlのディストリビューションです。

2022年11月現在、ActivePerlのPerlコアはv5.34.0(2021/05/22リリース)です。
Download & Install Perl - ActiveState

Strawberry Perl[編集]

Wikipedia
ウィキペディアen:Strawberry Perlの記事があります。

Strawberry Perlは、Microsoft Windowsプラットフォーム用のプログラミング言語Perlのディストリビューションです。 Strawberry Perlには、完全に機能するMingw-w64 C/C++コンパイラなどのツールチェインが含まれています。 Strawberry Perlは、環境変数はインストール時に設定済みなので、インストール直後に、コマンド プロンプト・Power shellあるいは、Windows Terminalから使うことができます。

2022年11月現在、Strawberry PerlのPerlコアはv5.32.1(2021/01/24リリース)です。
Strawberry Perl for Windows

macOS, FreeBSD, その他 UNIX 環境[編集]

maxOS, FreeBSD, その他 UNIX 環境ではほとんどの場合、PerlはOSのユーザーランドとは別にパッケージとして提供されています。「ターミナル」を起動し、コマンドプロンプト($, %, >などの記号)に続けてperl -vと入力し、⏎([Enter]または[Return])キーを押し、以下のように表示されればperlが利用可能です。

% perl -v

This is perl 5, version 36, subversion 0 (v5.36.0) built for amd64-freebsd-thread-multi

Copyright 1987-2022, 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.73
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]。 つまり、原則としてプログラムはソースコードに記述された順に実行され、iffor などの制御構造があったときだけ分岐・反復します。

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.
  1. シバン(shebang!)で、スクリプトを実行するインタープリターの位置を教えます。
    #!/usr/bin/perlとする例を見かけますが、perl が /usr/bin/perl でなく他の場所(例えば /usr/local/bin/perl)にインストールされている可能性があるので#!/usr/bin/env perlとしました。これは、PATHが通ったディレクトリに perl と言う名前のトロージャンホースを仕掛けられるリスクがあるとの批判がありますが、$ perl hello.plするときにも同じリスクがあり、リスクゼロではありませんが受入れがたいものではないと考えられます。
  2. Perl v5.12 以降の機能を有効にしています。
  3. 安全ではない構文を制限する Perl プラグマ strict は Perl5.12 からディフォルトで有効です[4]
    strict が有効なので、グローバル変数の使用はエラーとなります。
    無効にするのは、 no strict; とします。
  4. 選択的な警告を調整する 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;とuse warnings;
プラグマ use v5.12;とuse warnings;は必ずプログラム冒頭で指定しましょう。

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によるコメント[編集]

コード例
#!/usr/bin/env perl
use v5.12;
use warnings;

=begin comment

   ここの中は複数行にわたるコメント
   プログラムの動作には影響を与えない。

=end comment

=cut
Podという本来はソースコード中にドキュメントを記入する機能を利用して複数行コメントを書きます。
=の前に空白等の別の文字が入った場合はコメントにならないので注意が必要です。

__END__によるコメント[編集]

#!/usr/bin/env perl
use v5.12;
use warnings;

__END__
ここにはどんなデータも置くことが出来ます
データーなのでPerlの文法に従う必要はありません
__END__ は、本来コメント用の構文ではなく、コードの終了を示す特殊リテラルです。
__END__ の次の行からはプログラムに埋め込まれたデータとみなされ、プログラムとして実行されないので、どんな内容でも記述できます。

ちなみに、この内容はファイルハンドルDATAから読み込むことができます。

使用例
#!/usr/bin/env perl
use v5.12;
use warnings;

print "$.: $_" while <DATA>;

__DATA__
ここにはどんなデータも置くことが出来ます
データーなのでPerlの文法に従う必要はありません
CSVやJSONでデーターを埋め込むのも良いでしょう
実行結果
1: ここにはどんなデータも置くことが出来ます
2: データーなのでPerlの文法に従う必要はありません 
3: CSVやJSONでデーターを埋め込むのも良いでしょう
この文脈において __DATA__ は、__END__ のシノニム。

ヒアドキュメントによるコメント[編集]

#!/usr/bin/env perl
use v5.12;
use warnings;

<<EOS;
ここにはどんなデータも置くことが出来ます
文字列の中なのでPerlの文法に従う必要はありません
EOS

say "コメントの外"
実行結果
コメントの外
ヒアドキュメントは、複数行にわたる文字列を実現する仕組みですが、その文字列を使う必要はありません。


脚註[編集]

  1. ^ /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
  2. ^ Perlでコンパイルといった場合、Perlインタープリターがソースコードを読込み内部表現に置換えることです。これは移植性・相互運用性の視点からは好ましい特徴で、C/C++やJavaのように実行形式や中間表現をファイルに書出すことではありません。
  3. ^ gotoはあります。が、大域脱出などはラベルと併用したループ制御文で実現できるなど、gotoが必要になるケースは極めて少ないです
  4. ^ strict - Perl pragma to restrict unsafe constructs - Perldoc Browser”. 2022年11月9日閲覧。
  5. ^ warnings - Perl pragma to control optional warnings - Perldoc Browser”. 2021年12月11日閲覧。