夢追い人

"It takes a dreamer to make a dream come true."―Vincent Willem van Gogh

現在Perl侵攻中!?

やぁやぁ諸君!現在私の脳内にPerl軍が侵攻している。みんなで退治してくれい!!!!

で、こんにちゃ(^^)


なんかの拍子でPerlを勉強してみたらまさにこんな感じになってしまいました。






※つまり今回はPerl入門です




手始め

1.インストール

今回はWindows版での説明ですのでActivePerlをインストールします。
インストールは次へ…というかNext押していくだけなので簡単ですね。
終わったらプログラムを探す⇒cmd⇒コマンドプロントを開いてperl -vと入力しEnterを押して、Perlのバージョン情報が表示されたらOKです。

2.基本的な使い方

基本的な使い方をご紹介。とりあえずWindowsで必ず守るべきお約束の文は以下。


use strict;
use warnings;

ワンラインスクリプトを書くとき以外は必ずつけろ…とのこと。useは所謂javaとかのimport文です。また、Perlで日本語+UTF-8を扱うときは、


use Encoding qw/encord decord from_to/;
use utf8;

も付け足すべきでしょうね。これらの使い方などは後々解説します。
さて、基本的なスクリプトの書き方は分かったところで次のようなスクリプトを書いてみましょう。


use strict;
use warnings;

print "Hello, World!\n"; # print("Hello, World!\n");でも可。

では、これを適当なファイルにhello.plという名前で保存し実行したいと思います。
コマンドプロントを開いてcdコマンドでhello.plを保存したファイルに移動します。そこで次のように実行してください。


>perl hello.pl

コマンドプロントにHello, World!と出力されたはずです。次のようにもやってみてください。


>perl hello.pl > hello.txt

今度はなにも出力されなくて焦った人もいるのではないでしょうか?実はこの場合ファイルに出力しているのでスクリプトのあるファイルに出来ているhello.txtを開いてみると、しっかりとHello, World!と記述されています。このような使い方をリダイレクトと言います。

3.様々な変数

では、変数です。変数の定義から離していこうと思いますが…めんどくさいのでコードをずらずらっと書き並べていこうと思います。


my $num; # スカラ変数
my @array; # 配列変数
my %hash; # ハッシュ変数
# 数値などの代入
$num = 1;
@array = (1,2,3);
%hash = (a=>2, b=>3, c=>4);

このまま突っ走ることはできないなぁと感じたのでここで解説。
見てわかるように各種の変数の定義にはmyを使います。スカラ変数は、数字や文字列などを扱う通常の変数、配列変数はその名の通り配列を扱います。ハッシュ変数はキーとそれに対応する要素を扱うものなのですが、これについて理解するにはいくらかの解説が必要なので後回しにしましょう。
では、次は四則演算です。これは以下のようにやります。


my $sum = 1 + 1; # 足し算
my $sub = 2 - 1; # 引き算
my $mul = 3 * 3; # 掛け算
# 割り算↓
my $div = int(3 / 2); # 商
my $mod = 3 % 2; # 余り
# インクリメント・デクリメント(補足)
my $i = 2;
$i++; # 出力:3
$i--; # 出力:1

特筆することは特にありませんが、強いて言えば商の部分でしょうか?Perlでは(Perl以外でもそうでしょうが)普通に割り算をしようとすると小数点以下まで表示されます。というわけで、商はint()でint型、つまりは整数に変換して出力しています。インクリメントとデクリメントはとりあえずどうなるかだけ覚えとけばいいです。
次は文字列操作です。とりあえず基本から操作で使う関数まで一気に書いてしまいましょう。


# ダブルクウォート、シングルクォートのどちらでもできる。
my $str1 = 'abc';
my $str2 = "efg";
my $str3 = "h\tij\n"; # \tはタブ、\nは改行
my $str4 = "$str1 d"; # 変数展開。出力:abc d
# 文字列操作
my $join1 = 'abc'.'def'; # 結合・其の壱
my $join2 = join(',', 'abc', 'def'); # 結合・其の弐
my @part = split(/,/, 'abc,def,ghi'); # 分割
my $length = length 'abcdef'; # 長さ
my $substr = substr('abcd', 0, 2); # 切り出し※1
my $result = index('abcd', 'cd'); # 検索※2

切り出しと検索に※をつけましたのも、ほかはともかく、これには理解しておきたい概念があるからなのでございます。
この切り出しの場所指定や、検索の結果などはスライスという概念で表します。これはPythonなど他のプログラミング言語でももちろん使われます。たとえば此処にHelloという文字列があったとき…

+-+-+-+-+-+
|H|e|l|l|o|
+0+1+2+3+4+

このように一番左側の文字に0、そこから順に数字を割り当てていったとき、これらの数字がその文字のアドレス―場所になります。つまり※1はabcdのアドレス0からアドレス2の一つ前までを切り出す…結果はabとなります。また、検索ではcdと最初に一致する―つまり、cのアドレスである3を出力するのです。文面の都合上あまりたくさんは書けませんが、スライスは重要な概念なのでググるなり本でみるなりして理解を深めておいてください。

さて、配列です。あれですね。サンプル行きましょう。


my @array = (1,2,3);
$array[0]; # =>1
$array[1]; # =>2
$array[4] = 4; # 代入
my $first = shift @array; # $first=1 $array[0]=2
unshift @array, 5; # $array[0]=5
my $last = pop @array; # $last=3 $array[2]=none
push @array, 9; # $array[2]=9

とりあえずコメントの読み方さえわかればできるでしょう。今回コメントでつかった省略記法は=>がprintなどで出力する結果を指しています。またコメント内での変数のイコール表記はその操作をした際に各変数がどう変化するかを表します。noneはその変数がなにも値を持たなくなるということです。
細かいことは後回しにしてまずはどれを使うとどのようなことができるのか、という外観だけでも掴んでおけばいいです。ちなみに省略記法は僕独自のものですが、それはつまりこれからも使うかもしれないので僕のブログを読む際は頭の片隅においておいてください。

では、最初はちょこっとしか話さなかったハッシュについてです。ハッシュは簡単に言うと各要素にキーが付いた配列といったところでしょうか。さきほど定義したハッシュ変数をつかってみましょう。


$hash{a}; # このように要素の参照はキーで行う。
$hash{d} = 5; # キーをdとして5を代入
@keys = keys %hash; # @keysは%hashのキーだけで構成した配列になる。
@values = values %hash; # @valuesは%hashの要素だけで構成した配列になる。
exists $hash{a}; # %hashにキーがあるかどうか調べる。
delete $hash{a]; # %hashのキーaを削除する。それに対応する要素も削除される。

今回は真面目に書きました(笑)1つ補足でいっておくと、今回はハッシュのキーはなにも囲まずに書きましたが、これはキーがa-zA-Z_の時のみで他の、例えば名簿などを作りたい時にstudent1などというキーを使いたいならそれはシングルクォート(' ')やダブルクウォート(" ")で囲む必要があります。
これでとりあえず計算機としてperlを使いこなせるようになったことでしょう。ですが、プログラミングとはもっと複雑な問題につかえなければ意味がありません。というわけで次項では制御構文について話します。

3.制御構文

現在午前一時になろうとしているところ…こんな時間に各記事じゃなさそうですが書きましょう。
Perlの制御構文はだいたい他のプログラミング言語と同じです。種類はif-else文while文for文・foreach文あたり。ではざざっとコードみますか。


# if文else文elsif文
if (条件a) {
# 処理1
} elsif (条件b) {
# 処理2
} else {
# 処理3
}

# while文
my $i = 0;
while ($i < 5) { # 五回のループになる。
# 処理4
$i++;
}

# for文
for (my $i = 0; $i < 5; $i++) {
# 処理5
}

# foreach文
foreach my $field (@fields) {
# 処理6
}

読者のみなさんならわかりますよね?と言い切りたいけど、現状じゃそうもいかないので一つ一つ解説いたします。
まずif関係のところは日本語にすれば「条件aがあっているなら処理1を行い、条件aはあっていないが条件bはあっているなら処理2を、どちらの条件もあっていないなら処理3を行う。」となります。要するに“if-もし”なんです。もちろんelsif文をたくさん使えばそれだけ条件も多く書けます。一応いっておけばこの一群の制御構文を条件分岐と呼びます。
次はwhileですね。whileは括弧内の条件が正しい(…とここまで正しいとかあっているとかいってきましたがそろそろめんど臭いので言っておくとパソコンでは条件が正しいことをtrue(真)、正しくないことをfalse(偽)といいます。英語での表現は実際にプログラムのなかで使えることがあるので覚えておきましょう。)間、処理4を繰り返します。ここでは$iを0で初期化し条件を$i < 5($i小なり5)、そして処理の最後にインクリメントしているので$iがインクリメントによって5になるまで…つまり5回のループができます。 for文も同じようなものです。とはいってもfor文の構文はなれないと何をやっているか分からないので説明しましょう。


if (変数の初期化;条件;ループの最後にやる処理){}
このように;で区切った最初にループを制御するための変数を定義(while文でのmy $i = 0;と同等)し、次の部分にループを制御するための条件を設定(while文でいえば()内の条件のこと)し、最後に一回のループにでの最後に行う処理(while文での最後のインクリメントと同じことをしています。)を書くのです。つまるところwhile文と変わってない気がしますが、その違いはプログラミングを進めていけば自ずと分かると思います。
そして最後の難関foreach文は基本for文と同じです。まぁ表記は違うので戸惑うかもしれませんがPythonでのfor文と同じようなものと思えばいいと思います。で、Python知らない人のためにアバウトに説明しておくと@filedsの要素を前から1つづつ取り出して$filedに代入していき、@filedsの要素が無くなるまで続けるとかそんなところでしょうか。(間違ってたらすいません。)補足としてこのforとforeach文はどちらもお互いの表記ができる…つまりはfor文でforeach文の書き方ができるし、その逆もできるというわけです。まぁ基本は今紹介した書き方で覚えておけばいいでしょう。
最後に条件の書き方です。








表記意味
$p == $q $pと$qは等しい。
$p != $q $pと$qは等しくない。
$p < $q $pは$qより小さい。
$p > $q $pは$qより大きい。
$p <= $q $pは$q以下。
$p >= $q $pは$q以上。


表記意味
$p eq $q $pと$qは等しい。
$p ne $q $pと$qは等しくない。
$p lt $q $pは$qより小さい。
$p gt $q $pは$qより大きい。
$p le $q $pは$q以下。
$p ge $q $pは$q以上。


最初が数値の、最後が文字列の比較演算子の一欄となっています。Perlでは文字列と数値は厳密に区別されるのでもしエラーがでるようならもう片方の比較演算子をつかえばうまくいくかもしれません。



m(_ _)m工事中m(_ _)m