Perlはなぜ初心者でも簡単に扱えるのですか?
Perlは初級者でも簡単に扱うことができるプログラミング言語として知られています。「Perlはだれでも書けるので、ITの知識がない人でも書けてしまう。」と批判的な意味合いで言われているくらい簡単に書けます。
プログラミングのプロではない技術者もプログラミングを書きたい
Perlはもともと、プログラミングのプロフェッショナルではないIT技術者が、プログラミングを書けるように開発されたものです。
たとえば、システム管理者、サーバー管理者、セキュリティ技術者、ネットワーク管理者、大学の他分野の研究者など、プログラミングを書くプロフェッショナルではないけれども、プログラミングを書けると業務が効率化できる職業の方たちがおられます。
Perlは、プログラミングのプロではないIT技術者でも、簡単に書けるように意図されています。
このPerlの簡単に書ける機能は、大変人気があり「動的な型」「main関数の定義なし」「コンパイルがいらない」「言語組み込みの動的配列と連想配列」などのPerlで成功した主要な機能を、Python、PHP、Ruby、JavaScriptなどのプログラミング言語が取り入れました。
後発の言語が登場しても、Perlは、いまだに、現役です。それは、2022年でも、IT技術の最新の機能に柔軟に対応でき、なお簡単に書けるということを意味しています。
Perlが簡単に書ける理由
なぜPerlは簡単に書けるのでしょうか? 技術的な面から、見てみましょう。
動的な型
Perlは、動的な型を持っています。動的な型というのは、どのような型でも変数に代入できるという意味です。これは、プログラミングを学び始めるときに、型のサイズや変換に関する知識を、学ぶ必要がないということを意味しています。
# 動的な型 my $num = 1; my $num = 1.5; my $message = "Hello"; my $point = Point->new; my $object = undef;
言語組み込みの動的配列と連想配列
Perlには言語組み込みの動的配列と連想配列があります。動的配列と連想配列があれば、プログラムで必要になるほとんどのデータ構造を表現できます。
# 動的配列 my @nums = (1, 2, 3); push @nums, 5; # 連想配列 my %person = (id => 1, name => 'Yuki');
main関数の定義なし
Perlはmain関数なしでプログラムを実行できます。
print "Hello World!";
コンパイルがいらない
Perlプログラムをコンパイルするという作業なく、すぐに実行できます。コンパイル速度は速いです。
perl a.pl
数値と文字列の自動変換
Perlは、数値と文字列を区別する必要がありません。データの型が演算子の意味を決めるのではなくって、演算子がデータをどのような型として扱うかを決めるからです。
# Perlでは2となる my $total = "1" + "1";
Perlでプログラミングするときは、数値の型と文字列の型を区別しないで、書くことができます。
言語組み込みの正規表現
Perlには、言語組み込みの正規表現があります。Perlはシステム管理者が、テキストを多く扱うことを想定しており、テキストの検索・置換を、ライブラリを読み込まずに、言語の文法を使って、すぐに書くことができます。
# もしappleが含まれていたら if ($message =~ /apple/) { } # すべてのappleをorangeに置換 $message =~ s/apple/orange/g;
Perlの正規表現は、その互換仕様が広く使われており、Google RE2やLinuxのgrepの「-P」オプションなどに、実装されています。
ワンライナー
Perlは、Linux/UNIXのコマンドと組み合わせて使えます。ワンライナーと呼ばれる機能が強力です。
以下のように書くと、カレントディレクトリ以下にある、拡張子が「.txt」と「.html」のすべてのファイルに含まれる「apple」が「orange」に置換されます。
(置換は危険な操作なので、気軽に、実行しないでください。)
find * | grep -P '\.(txt|html)$' | xargs perl -pi -e 's/apple/orange/g';
簡単なファイル入出力
Perlでは、ファイル入出力に関する知識を覚えなくても、ファイル入出力ができてしまいます。
以下のようにコマンドとプログラムを書くと「input.txt」の中のすべての「apple」は「orange」に変換され「output.txt」に出力されます。
perl test.pl input.txt > output.txt
use v5.36; while (my $line = <>) { # 改行削除 chomp $line; # 行処理 $message =~ s/apple/orange/g; # 出力 say $line; }