FAQ - Perlでよくある質問に答える



  1. Perl



  2. FAQ

Perlでよく訪ねられる(であろう)質問について書いてみたいとおもいます。

引数のないshift関数はどういう意味ですか

Perlのソースコードでは、引数のないshift関数をよく見かけると思います。引数のないshift関数の意味は次のようになります。

  1. サブルーチンの中では、サブルーチンの引数の第一引数を取ってくる
  2. それ以外の場所では、コマンドライン引数の第一引数を取ってくる
sub foo {
  # 「my $x = shift @_;」 と同じ意味
  my $x = shift;
}

# 「my $y = shift @ARGV;」と同じ意味
my $y = shift;

Perlで日本語を扱うことは可能ですか

 Perlはほぼ完全にUnicodeに対応している言語です。またたくさんのエンコーディングをサポートしているので、さまざまな環境で文字を扱うことができます。Perlで日本語を扱う参考として以下の記事を参考にしてみてください。

 jcode.plやJCode.pmは現在では推奨される手法ではなくなっているので、Encode.pmを利用する現代の標準的な手法を学んでみてください。

Perlに例外処理はありますか

 はい。あります。Perlではevalブロックという構文を使います。例外が発生した場合は$@という変数に例外の内容が代入されるのでチェックします。

# 例外処理
eval {
  ...
}

# 例外が発生した場合の処理
if ($@) {
  ...
}

 特別なモジュールを利用する必要はなく、デフォルトの機能として例外処理は用意されています。

文字列を関数を使って操作したいです

 Perlにはいろいろな文字列関数が用意されています。よく使用する関数・モジュール一覧の「文字列操作」という項目を読んでみてください。

Perlでは変数のスコープはどのようになっていますか

Perlのスコープを理解するという記事でPerlのスコープについて解説しています。

日付を扱う標準的な方法はありますか

 Perl5.10以降であれば、Time::Pieceというモジュールが標準で添付されています。Time::Pieceモジュールの解説を読んでみてください。

Perlで自動試験を行うことはできますか

 はい。自動試験を行うことができます。自動試験については自動試験(Perl逆引き事典)を参考にしてみてください。

PerlでWebアプリケーションを作成するにはCGIを利用するしか方法はありませんか

 現在ではさまざまな方法が可能です。CGIを使うほかに、Apache上のmod_perlで実行する方法、FastCGIプロトコルを使って実行する方法、PSGIと呼ばれるプロトコルを利用して実行する方法などです。
 簡単にWebアプリケーションを記述したいのであれば、CGIモジュールを使うよりも、Mojoliciousというフレームワークの中のMojolicious::Liteというモジュールを利用するのがよいでしょう。

Webフレームワーク Mojolicious

PerlはCGIを実現するためのプログラミング言語ですか

 いいえ、Perlは汎用的なプログラミング言語です。とても多くのことがPerlで行うことができます。CGIというのはプログラムをWebサーバー上で実行するためのプロトコルのことで、Perlとは直接的には関係はありません。

Webアプリケーションの開発はPHPのほうがPerlよりも簡単ですか

 PerlのCGI.pmを使った開発に比べるとPHPによるWebアプリケーションの開発は断然簡単でしょう。このため多くの人はPHPのほうが簡単にWebアプリケーションを開発できると感じているようです。
 ですがMojoliciousなどのWebフレームワークを利用した場合は素のPHPによるWebアプリケーション開発よりもさらに高い開発効率を得ることができます。さらに、記述がきわめて簡潔になる、試験環境の構築がいらない、自動試験による信頼性の高いアプリケーション開発、インストールの容易さ、さまざまな環境で実行できる汎用的なアプリケーション開発などさまざまな利点を得ることができます。
 比べるときの正しい観点は「PHP vs Perl+CGI.pm」ではなく、「PHP vs Perl+Webフレームワーク」であるということを認識しておくことは大切です。

PHPはPerlよりも高速ですか

 これもよく書籍などで書かれていることが多いですが、完全な誤解です。PHPという言語とPerlという言語を比べた場合、処理速度はそれほど変わりません。

 よくPHPはCGIより速いと書かれていますが、CGIについて誤解した上での記述です。CGIとはプロトコルのことでPerlとは何の関係もありません。つまりCGIを利用するPHPやCGIを利用するC言語やCGIを利用するPerlがあります。

 CGIで書かれたPHPは、CGIで書かれたPerlと同じくらい低速な速度です。Apache上のmod_phpで動くPHPは、Apache上のmod_perlで動くPerlと同じくらい高速です。またPSGIというプロトコル上で動くPerlは、Apache上のmod_phpで動くPHPと同じくらい高速です。

 つまり速度比較というのは、PHPとPerlのどちらを選ぶかという言語選択においてはほとんど意味を持っていません。

Perl6とPerl5の関係について教えてください。

Perl6は過去にPerl5の後継として開発されていましたが、現在は、Perl6はPerl5とは別のプログラミング言語です。Perl6は、2016年12月に正式にリリースされました。現行のPerlであるPerl5は、将来にわたって開発が続き、サポートされることが約束されています。

詳しくは以下の説明をご覧ください。

ネットを見ているとPerlが否定的に評価されがちなのはなぜですか。

いろいろな原因が考えられますが、ほとんどの人が言語の有用性ではなく、言語のイメージで語っているからです。たとえば「新しい」「古い」といった漠然としたイメージです。新しい言語が好きな人はPerlに対して古いというイメージを持ちがちになるのだと思います。またPerl4の時代に保守性の悪いPerlスクリプトを保守させられたという苦い経験が悪いイメージにつながっているのかもしれません。

またPerl6の誕生がいわれてから10年もたっているので、Perl5に対して廃れたイメージを持っている人も多いでしょう。世の中の流れはPerlに対して古典的なイメージを抱かせがちな雰囲気になっていますが、Perlのコミュニティにも原因がありますし、Perlではない言語のコミュニティにも原因があるのでしょう。

他のスクリプト言語と比較したPerlの良い特徴はなんですか

 ひとつはたくさんのプラットフォームで利用することができ、デフォルトでインストールされていることが多いということです。たとえばプログラミング言語をインストールする権限がもしなかったとしても、Perlを利用することができる可能性が高いということです。

 また後方互換性が非常に高いレベルで維持されるので、作成したスクリプトは、何の変更もなしに、他の環境で実行することができます。どのバージョンを意識して書かなければならないという悩みはPerlにはあまりありません。Perlのバージョンの5.8を意識して記述すれば、ほとんどの環境で実行することができるでしょう。この点についはPerlは他のスクリプト言語と比べてかなりの配慮が払われておりユーザーに優しいです。

 もしあなたがインフラエンジニアであれば、Perlは知っておくべき言語の一番目に入るといっても過言ではないと思います。将来にわたってスクリプトを安心して動かし続けることができます。またWebエンジニアであれば、PHP,Ruby,Perlのうちのどれか一つを勉強することになると思います。

 またテキスト処理の処理速度は速いです。テキスト処理を一般的に行う環境であれば、おそらくRubyの2倍以上の速度でテキスト処理が行えるでしょう。これは1時間かかる処理を30分で終えることができるということです。テキスト処理におけるプログラミングの記述性とパフォーマンスを考えるとPerlは最善の言語であるといえるでしょう。

 また他のスクリプト言語と比較すれば省メモリですし、コンパイル速度も高速です。またPerlは他の人がイメージしているのとは異なり、スクリプトをきれいに書くことができる言語のひとつだということも押さえておくべきポイントです。記述性においてRubyやPythonがベストと呼ばれるならば、Perlは少しだけ及ばないですが、かなりベターと呼べるくらいきれいにかけます。

 CPANと呼ばれる無料で利用できるモジュールが豊富にあるというのも大きな魅力の一つです。Perl本体でできないことがあった場合には、CPANにあるモジュールを調べるとほとんどの場合に解決することができるでしょう。

 またWebアプリケーションをとても作成しやすい環境があるというのも、利用するポイントになるでしょう。Mojoliciousというとても使いやすいWebフレームワークがあります。

 というわけで、Perlはビジネス用途にも適した言語であるということがいえると思います。

Perl4(Perlのバージョン4)を学ぶ必要性はありませんか

 インターネットにはPerl4でも動かせるスクリプトは多いですが、現在ではPerl4を意識してPerlを書く必要はないといってもよいでしょう。Perl5の普及率はほぼ100%ですので、保守性や可読性や柔軟性に優れたPerl5の記法で書くのが良い方法です。Perl5は、可読性や保守性において、改善されて新しくなっています。

シジル「$@%」がなじめないのですが。

 しばらくPerlを利用していると慣れてくると思われます。シジルの利点を書いておくと、それが変数だということが視覚的にわかるということです。他の言語と比較するとPerlに慣れていないので読みにくく感じると思いますが、慣れてくるとそれが変数だということが視覚的にわかるのでかえって読みやすくなります。また関数名と変数名が衝突するということは絶対に起こらないので、プログラミングをするときに、予約語はなんだったかなぁということを考えてプログラムする必要がないので、ストレスなくプログラミングができます。

Perlのソースコードは1週間たつと自分でも読めなくなるといううわさは本当ですか

 いいえ。他の言語と同じように、わかりやすく記述すれば読めますし、わかりにくく記述すれば読みにくくなります。現代のPerlはPerl5と呼ばれ、一昔前のPerlではなく、読みやすさや保守性が大幅に改善されています。他のスクリプト言語に劣らずわかりやすく処理を記述することができます。一昔前に書かれたソースコードを読もうとすると、読むのが難しいというのは事実だと思いますが、Perl言語そのものが原因ではありません。単に良いソースコードを記述するための知識が蓄えられる前にたくさんのコードが書かれたということです。

 たとえばひとつの例として代表的なWebフレームワークであるPerlのMojoliciousとRubyのRuby on Railsのソースコードを比較してみましょう。どちらが読みやすいと感じますか?

Perlは古いというのは本当ですか

 起源が古いという意味であれば本当です。Perlは1987年生まれの言語です。けれども古いというのは使えないとか不便だという意味ではありません。Perlは現代的なプログラミング言語として多くの分野で利用されていますし、コミュニティは活発で、定期的に言語のバージョンアップがなされています。最新の技術に対応したモジュールはコミュニティによって活発にCPANにリリースされています。また大量のアクセスを処理する必要のあるWebの分野でPerlを利用している企業は多くあります。

PythonやRubyはPerlを進化させた言語ですか

 進化させたというよりは参考にしたというほうが正確でしょう。3つの言語はよくにていて、みっつの言語が行うことができるプログラミングの分野はよく似ています。それぞれにプログラミング言語として個性的な一面があるといったほうがよいでしょう。ただ情報を鵜呑みにするのではなくて、実際に確かめてみるというのは大切なことです。

 Perlに対して否定的でPythonやRubyを薦められるときはその理由を聞いてみましょう。「新しくてきれいにかける。とてもすばらしい。」ということしか教えてくれないければ、その人は言語についてあまり知らない可能性が高いです。

CやJavaのように型がないので自由すぎて馴染めません

 Perl、Ruby、Pythonなどのスクリプト言語では、変数(Perlではスカラ変数)にどのような型のオブジェクトでも代入することができます。

# Perl
my $url = URL->new;

# Java
URL url = new URL();

 静的な言語を学んできた人にとってみれば、この部分だけを見ると扱いにくい言語と見えるかもしれません。

 ですが、型がないということは、静的言語に比べて明らかに大きすぎる利点があります。ひとつめはメソッドのオーバーロードについて何も考える必要がないということです。C++やJavaにはメソッドのオーバーロードという機能があります。これはメソッドの引数の型が異なった場合に、同じ名前のメソッドを定義できる機能です。たとえば浮動小数点型を引数にとるメソッドと整数を引数にとるメソッドは別に記述しなければなりません。

# Java
int sum(double num1, double num2) { ... }
double sum(double num, double num2) { ... }

 一方動的に型を持つ言語ではひとつだけですみます。これは重複をなくすという意味で保守性は大幅に高まります。

sub sum { }

 第二にC++のようなテンプレートクラスを考える必要はないということです。どのような型でも受け取ることができるので、メソッドやクラス定義において型に応じて何かをするという記述を行う必要がありません。

 第三に(Javaにおける)インターフェースを考える必要がないということです。Javaのクラスの設計は共通のインターフェースを考えるというとても難しい作業が伴います。汎用性を高めようとするとインターフェースの設計はかかせないものになるでしょう。動的言語の場合はどのような型をもつオブジェクトであっても、変数に代入することができ、メソッドを実行時に呼び出すのでこのような心配をすることがありません。

 ですから、型がないということをマイナスに見るのではなくて、保守性の高い重複のない簡潔なプログラミングを記述することができるという動的言語のプラスの面に目を向けてみるのはどうでしょう。実際にプログラミングを簡単に記述できるということがわかってくるかと思います。

大規模なプログラムをPerlで作成することができますか

 はい。Perlは小さなプログラムを作成するのに向いていると考えられることがありますがそんなことはありません。たとえば大きなプログラムはJavaで、小さなプログラムはPerlで作ろうといういったようなイメージを持っているとしてら、Perlという言語を誤解していることになります。

 Perlで書けば静的な言語で記述するよりもかなり少ないコード量で大規模なアプリケーションが作成できることに気づくと思います。また大規模なアプリケーションを作成するのに困難と思える部分はないということにも気づくと思います。

 たとえばひとつの例としてAmazonというサイトはPerlで記述されているということを考えれば、Perlは大規模なプログラミングに向いてはいないのではないかという誤解は解けるのではないかと思います。

Perlでオブジェクト指向プログラミングを行うことができますか

 Perlでオブジェクト指向プログラミングを行うことは可能ですし、オブジェクト指向プログラミングを行うための十分な機能を備えています。ただし他のオブジェクト指向言語とは、クラスの作成を行う手順が少し異なります。このために、初めてオブジェクト指向プログラミングをする場合は、いくらか学習コストが他の言語より高く感じてしまうでしょう。またPerlのオブジェクト指向の記述は、他のスクリプト言語よりも手間がかかるというのは本当です。モジュールを使えば他言語と同じ程度に記述を軽減できますが、Perlのコアには標準的なオブジェクト指向モジュールが含まれていないので、CPANからなんらかのモジュールを利用することになるでしょう。

 たとえばObject::Simpleを使うと以下のように記述できます。

package Point;
use Object::Simple -base;

has x => 0;
has y => 0;

1;

 基底クラスの継承。

package Point3D;
use Object::Simple 'Point';

has z => 0;

1;

 他の言語に劣らずシンプルなクラスの記述が可能です。

CentOSでPerlの標準モジュール(コアモジュール)が使えません

 さくらVPSでCentos6を試してみて気づいたことなのですが、デフォルトでインストールされているPerl 5.10.1は、正規のPerlではない感じです。Mojoliciousアプリケーションを動かそうとして気づいたことですが、標準モジュールの一部が足りていません。なんてこったい。

 以下のパッケージをインストールすることで、コアモジュール(標準モジュール)が利用可能になります。

yum -y install perl-core

CetnOS7以降も同じ方法をお試しください。