1. Perl
  2. here

Perlって何ができるの? - Ruby, Python, PHPとの比較も

「Perlって何ができるの?」たくさんのプログラミング言語が登場して、どのプログラミング言語を選択すればよいか、悩んでおられる方もおられると思います。Perlでどんなことができるのか、答えるコンテンツを作成しました。

検索・置換などの正規表現を使ったテキスト処理が得意

Perlは検索や置換などのテキスト処理が得意なスクリプト言語です。正規表現が言語に組み込まれており、簡単に検索や置換のプログラムを記述することができます。

# すべての「banana」を「orange」に置換
$message =~ s/banana/orange/g;

テキスト処理の処理速度は高速です。処理内容によりますが、体感的には、低価格でレンタルできるLinuxサーバーで、10万行のテキストを1秒程度で処理できます。

Perlの正規表現は、そのオリジナリティと有用性で広く知られており、Linuxのgrepコマンドの「-P」オプションとして使うこともできます。

# Linuxのgrepコマンドの「-P」オプションでPerlの正規表現が使える
grep -P '(foo|bar)$' file

正規表現が、組み込まれているプログラミング言語には、Perlの他に、Rubyがあります。

型を意識しなくてよいので簡単に書ける

Perlでは、文字列と数値の型を意識しなくてよいので簡単に書けます。コマンドライン引数で、文字列として数値を取得した場合を考えてみます。Perlでは型を意識せず、そのまま計算ができます。

# コマンドライン引数
my ($num1, $num2) = @ARGV;

# 型を意識せずに計算
my $total = $num1 + $num2;

コピーアンドペーストが簡単に書ける

Perlは、コピーアンドペーストが簡単に書けるように工夫されています。コピーアンドペーストがやりやすいと、元のデータを、誤って編集してしまうリスクを減らすことができますし、なにより簡単です。

文字列リスト演算子

文字列リスト演算子を使用すると、空白区切りの文字列を、簡単に配列にできます。

たとえば、以下のようなテキストを、すぐに配列にしたいとします。

cat
dog
mouse

文字列リスト演算子を使うと、コピーアンドペーストで、すぐに配列にできます。

my @animals = qw(
cat
dog
mouse
); 

データセクション

データセクションという機能を使うと、コピーアンドペーストで、1行づつ読み込むことができます。

たとえば、以下のようなテキストを、1行づつ処理したいとします。

<pre>
Hello World
Perl Book
Web Development

データセクションを使うと、コピーアンドペーストで、すぐに1行づつ処理ができます。

while (my $line = <DATA>) {
  # 1行づつ処理
}

__DATA__
Hello World
Perl Book
Web Development

囲み文字の変更

Perlでは、ダブルクォート演算子クォート演算子を使って文字列の囲み文字を変更したり、「m」の表記を使って、正規表現の囲み文字を変更できます。このため元のデータの方を変更せずに、コピーペーストできます。

# ダブルクォート演算子
my $name = qq(aaa"bbb);

# クォート演算子
my $name = q(aaa'bbb);

# 正規表現パターンマッチでmを使って囲み文字を変更
if ($name =~ m|http://|) {
  # ...
}

# 正規表現の置換で囲み文字を変更
$name =~ s|http://||;

正規表現の\Qによるエスケープ

正規表現による「\Q」によるエスケープを使うと、正規表現文字のことを意識せずに、コピーアンドペーストで、単なる文字列としてマッチさせられます。

my $re = "abc[]...";

if ($name =~ /\Q$re/) {
  # ...
}

Perlワンライナー

Perlの「-e」オプションを使うと、Perlのプログラムを、1行のコマンドのように実行できます。これは慣習的にPerlワンライナーと呼ばれます。Linuxサーバー管理・UNIXサーバー管理で威力を発揮します。

# .htmlで終わるファイルを検索して、ファイルの中のすべてのfooをbarに置換
find * | grep -P '\.html$' | xargs perl -pi -e 's/foo/bar/g';

Perlワンライナーの中では、Perlのすべての機能を使うことができます。また、Linux/UNIXで、Perlは広くインストールされているので、同じ記述で、ポータブルに動かすことができます。

Perlワンライナーについては、以下も参考にしてください。

ワンライナーが使いやすいプログラミング言語には、Perlの他に、Rubyがあります。

Perlの関数を使ってできること

Perlの関数を使ってできることは、以下の記事で解説しています。

Python・Ruby・PHPの関数でも同じようなことができます。

Perlのモジュールを使ってできること

Perlのモジュールを使ってできることを、簡単に紹介します。他のプログラミング言語では、ライブラリと呼ばれているものを、Perlではモジュールと呼びます。Perlには、標準で添付されているモジュールとCPANと呼ばれるサイトから無料でインストールできるモジュールがあります。

Perlのモジュールを使ってできることについては、以下のモジュール徹底解説を参考にしてください。

Python・Ruby・PHPのライブラリでも同じようなことができます。

UNIX/Linuxサーバー管理

Perlは、歴史的にUNIX/Linuxサーバーとの相性が良いです。Perlワンライナーが自然に使え、UNIX/Linuxで使えるコマンドとの関連性も高いです。ほとんどのUNIX/Linuxサーバーに、Perlがインストールされています。

Webサイト作成

Perlはテキスト処理が得意なので、テキストフォーマットであるHTMLの出力も得意です。PerlのWebサイト作成では、Gitと組み合わせた場合に、強い力が発揮できると感じます。

Webサイト作成のためにHTML・CSSを学びたい方は、こちら。Giblogというツールを使って、Webサイトを作る方法も解説しています。

Webアプリ開発

Perlは、HTML・メール本文・Ajax通信で動的なHTMLのコンポーネントを出力するのが得意なので、Webアプリ開発が得意分野です。

Webアプリ開発でHTML・メール本文・Ajax通信で動的なHTMLのコンポーネントを出力する分野は、PHPが広く良く知られ、強い分野ですが、Perl・Rubyの得意分野でもあります。

Perlの強み

Perlの強みについて、簡単に記述しておきます。

Linux/UNIXミドルウェアの基盤

Perlは「git」「openssl」「Debian/Ubuntu系Linuxのコマンドラインツール」「mysql、PostgreSQLの周辺ツール」を支えるなどUnix/Linuxでのミドルウェアとして活用されています。

高いレベルの後方互換性

Perlは、非常に高いレベルで後方互換性が維持されているので、長い期間にわたって安定性を求められるビジネスの用途に向いています。

コンパイル作業なしですぐに実行

プログラムを実行するときにコンパイル作業を行う必要がありません。作ったプログラムはperlコマンドで、すぐに実行できます。

# Perlプログラムの実行
perl test.pl

何度も書き直す必要のあるプログラムでは、これは大きな利点です。

これは、Python、Ruby、PHPなども含んだ動的型プログラミング言語の特徴です。

Perlに感じる不安への回答

PerlについてWeb検索をしていて、Perlに対して不安を持たれた方もおられると思います。記事の表現に、問題があるとは考えますが、一般的に感じる不安を想像して、記述しておきます。

Perlの保守性・可読性は低いのですか?

他のWebサイトでは、Perlの保守性・可読性が低く、Pythonの保守性・可読性が高いという内容をお見かけになったこともあるかと思います。

実際には、可読性に関する実証的な研究はされておらず、極めて主観的に、各プログラミング言語のユーザーが、可読性の高さを、主張するような状況にあります。

Perlゼミは、こう記述しておきます。

現代的な記述方法とされている方法でPerlを書いた場合、Perlの可読性は比較的良く、書きやすさと読みやすさのバランスが取れています。

プログラミング言語には、可読性に関して、一長一短の部分があります。

たとえば、Perlでは、配列とハッシュの多次元データ構造を表現するためにリファレンスと呼ばれるデータ構造を読み書きできる必要があります。PythonやRubyでは、すべてリファレンスとして扱われるため統一感があります。

一方、プログラミングの構造を表現するためPerlのスコープは非常によく実装されています。スコープをうまく使った場合には、Perlの可読性を高めます。

Perlでオブジェクト指向はできないのですか?

Perlでは、2021年現在、オブジェクト指向を実現する機能はあるのですが、さまざまな事情で、簡潔に表現できるクラス構文が導入されていません。

Perlで、クラスを書くには、一般的に、以下のような表記になります。

package Point;

# アクセサ
sub x { shift->{x} }
sub y { shift->{y} }

# コンストラクタ
sub new {
  my $class = shift;
  
  my $self = {
    @_;
  };
  
  return bless $self, ref $class || $class;
}

package main;

my $point = Point->new(x => 1, y => 2);
my $x = $point->x;
my $y = $point->y;

生々しさを感じるので、簡単に書くことができるように、近い将来に期待したい部分ですね。

Ruby、Python、PHPには、クラス構文が存在します。

Perlは人気がないのですか?

一般の方については、よく存じ上げないのですが、良い動機でPerlを好んで使っておられる方を知っています。

PerlはAI・機械学習の分野で後れをとっていますか?

実務で必要がある場合は、深層学習については、パブリッククラウドのひとつのAmazon AWSで、PerlのAIライブラリAI::MXNetが公式にサポートされています。

Perlプログラミングをお試し

Perlで何ができるのかを、ひとつ試してみましょう。データセクションを使った、Perlのサンプルコードを動かしてみましょう。「,」カンマ区切りデータを「|」区切りに変換するPerlプログラムです。

以下のコードをリンク先で、貼り付けて「Save for 30 days & run」のボタンをクリックしてみてください。

use strict;
use warnings;

# 「,」カンマ区切りデータを「|」区切りに変換する
while (my $line = <DATA>) {
    chomp $line;
    my @items = split(/,/, $line);
    my $new_line = join('|', @items);
    print "$new_line\n";
}

__DATA__
1,Web Development,2000
2,Perl Tutorial,1500

プログラムを試す

入力は「__DATA__」以下に書かれているデータです。

1,Web Development,2000
2,Perl Tutorial,1500

Perlを実行すると出力結果は、以下のようになります。

1|Web Development|2000
2|Perl Tutorial|1500

結びに

ここまで長くなりましたが、Perlを学習して、Perlを楽しんで、Perlを使って仕事を楽にしてもらえればサイト運営者として幸いです。

関連情報