>> areatop / sitetop , contact , about <<
 

::コンテンツ::




Perl 基礎講座

初心者向けのPerlの基礎講座です。

Perlの文法について細かく扱うというよりは、
必要最小限のことを具体例をまじえつつながめていきます。

第一章 Perlの由来とその特色

#名前の由来 〜真珠になりそこねた言語〜

Practical Extraction and Report Language(PEARL)が元の名前です。
が・・後に同名の言語が先にあることがわかり、PERLになったといわれています。

#特色

"Perl is designed to make the easy jobs easy, without making the hard jobs impossible"  /Larry Wall

「簡単なことは簡単に、そして難しいことも決して不可能とはしないこと」を目指す。
それがPerlのコンセプトと言われています。

実際、初心者にも親しみやすい言語として人気があるようです。
(しかし、ホームページを持っていない人にはあまり知られていないようにも思いますけれど)

第二章 基本文法のイントロ

#変数 〜変数には記号がつく〜

Perlの珍しい特徴として、変数に記号がつくことが有名です。
Perlの作者LarryWallさんが言語学者だったのがその一因でもあるのでしょう。

たとえば、ドイツ語では名詞は大文字になります。
大文字で書くことによって、「 これは名詞だ」と表しているわけです。

Perlでは同じような言語学の流れを組み、変数の前に記号をつけています。
これによって誰でも変数であることがすぐにわかるわけです。
(こうすることで多少の利点もあるようですが、それはおいおいふれていくことにします・・)

ex1.
$date = '5月30日';
print "今日は$dateです";    #今日は5月30日ですと表示される

#文法 〜C言語と似ている〜

Perlは、C言語を始めとして色々な言語の文法を独自に組み合わせて作られています。
ですから、他の言語を使ったことがある人には馴染みやすい部分が多いと言われています。

第三章 Hello World

それでは、まず何か文章を表示させる段階から始めてみることにします。
何の工夫もありませんが、まずは"Hello World"を表示させてみます。

ex2.
print "Hello World";

実行結果
Hello World

単純に一行打って終わりです。
(もしそれに何の疑問もお感じにならないのでしたら、
 もののためしに、他の言語をためされるとよろしいかと思います)

print "〜〜"は、〜〜を打てという命令文ですね。
そして、文の最後には「;」(セミコロン)がつきます。

第四章 スカラー変数

#概論 〜スカラー変数とは何か〜

変数とは、数字や文字を一時的に保存しておく箱のことだとよく説明されます。
変数を使うメリットには、計算したり、書き換えたり、何より手軽に扱えることなどがあげられるのでしょうけれど、
詳しいことは省略します。

さて、変数にもいくつかタイプがあります。
Perlではおおまかに三種類の変数が登場しますが、
まずは、もっともシンプルな変数が今回のスカラー変数です。

ex3.
$data = 1000;
$name = "お隣さん";
print "$nameの財布には$data円入っている。";

実行結果
お隣さんの財布には1000円入っている。

変数には記号がつくという話を先にしました。
スカラー変数には、「$」という記号が頭につきます。
上の例では、$dataと$nameというのが変数です。

スカラー変数には、数字や文字を代入することができます。
「=」は、多くの言語同様、代入演算子であって、イコールの意味ではありません。
上の例では、$dataに1000を、$nameに「お隣さん」を代入しています。

print 文は第三章でやりましたよね。
文章を表示する構文なのですが、変数に格納されている値に、変数部分が置き換わっていることに注意してください。
これを変数の展開と呼びます。

plus one step.
・数字、英単語一語は""などを省略できる。
・print 文では、''は変数展開無し、""は変数展開あり
・変数の名前は英文字と数字を使えるが、一文字目に数字は不可。
・変数を宣言する必要はない

#四則演算 〜ごく普通に〜

四則演算ですが、ごく普通に行えます。
特に何かを気にしなければならない点はないでしょう。

ex4.
$num = 50;
$result = $num*50 / 4 + 2000;
print $result;

実行結果
2625

plus one step.
・文字は自動的に数値に変換される(ゼロになる)
・デフォルトで小数点計算をおこなう

第五章 スクリプトを書く

#コメントの入れ方 〜シャープを使う〜

Perlではコメンには「#」を使います。

ex5.
#コメントのサンプル
print $data; #ここでデータを出力
$title = ""; #掲示板のタイトル

多すぎず、少なすぎず、効果的に使いこなしたいところです。

#標準入力 〜キーボードからの入力〜

コマンドプロンプト上でプログラムを動かしている場合は、
キーボードからの入力データをプログラムに渡してやりたいことがあります。

ex6.
$data = <STDIN>;         #キーボードから入力待ち
chomp $data;            #改行コードを消す
print "$dataと入力されました";

<STDIN>と記述することで、プログラムがその場にさしかかると自動的に入力待ちになります。
エンターキーを押すと再開し、この場合であれば$dataに入力した情報が代入されます。

なお、一点だけ注意することとして、
このときの$dataには、キーボードから入力された文字列の後に「改行コード」なるものがくっついてきます。
chomp $data として、改行コードを切り落としてやらねばなりません。

one more step.
・STDIN は STANDARD INPUTの略。
・<>と省略できる

#スクリプトの流れ 〜下に向かって終わりまで流れる〜

ごく自然なことですが、プログラムは上から下の順に流れていきます。
そして、スクリプトの最後まで到達すると自動的に終了します。

また、exit; といれるとその時点で終了させることができます。

第六章 条件分岐

プログラミングの本質は条件分岐にあると思っています。(私個人は(笑))
そんな条件分岐について扱ってみます。

#if 〜もし〜〜ならば・・・〜

一番シンプルな条件分岐は多くの言語同様、if文でしょう。
細かく説明するよりも、サンプルを見た方が早いと思います。

ex7.
$item = "apple";
if ($item eq "apple"){ print "リンゴです。"; }
elsif ($item eq "orange"){ print "みかんです。"; }
else { print "リンゴでも、みかんでもありません。"; }

もし$itemがリンゴならば、「リンゴです。」と出力しなさい
もしくは、もし$itemがみかんならば、「みかんです。」と出力しなさい
全て違ったら、「リンゴでも、みかんでもありません。」と出力しなさい
という意味です。

先に、スカラー変数には数字も文字も関係なく代入できると言いましたが、
ここでは一点だけ違いが生まれます。
$itemが数字なら、「==」を。文字なら、「eq」を使うのです。

なお、eq の逆は neです。

ex8.
$item = "千円札";
if ($item ne "一万円札"){ print "一万円札ではありません。"; }

one more step.
・{ }は省略できません。
・elsifはいくつでも使うことができます。
・elsif、elseは必ずしも必要ではありません。
・ifの逆はunlessです。

第七章 ループ

条件分岐の複雑なものとして、ループの構文があります。
その代表とも言える、forについて扱ってみます。

ex9.
for ($k=0; $k<5; $k++){
 print "$k回目の表示!";
}

出力結果
0回目の表示!
1 回目の表示!
2 回目の表示!
3 回目の表示!
4 回目の表示!

for (初期化条件; 実行範囲; 処理) と説明するとわかりやすいでしょうか。
最初に、$kに0を代入して初期化し、
ループ内のprint文を表示させるごとに、$k++を一回実行します。
そして、その作業を$kが5よりも小さい間繰り返すわけです。
($k++ は $k = $k + 1という意味です)

for文は、主に何かの処理を指定回数行いたい場合に利用します。
Perlでは、他にwhileやforeachなどがありますから、
それらを代わりに使う場合もでてきますけれども。

plus one step.
・foreachがforとほぼ同じ役割をする
・lastでループから抜けることができる
・永久ループは、for (;;)とする(ただし、whileの方が良いかもしれないが)

第八章 ファイル入出力の基礎

特にCGIでは、頻繁にファイルの読み書きを行うことになります。
ここではその読み書きの基本的な書式を扱ってみます。

#ファイルからの読みとり

ファイルからデータを読みとる場合、
ファイルのオープン、データのコピー、ファイルのクローズ
という三つの段階を踏んでいくことになります。

ex10.
open (FILE, "data.txt"); #ファイルのオープン
$data = <FILE>;      #データのコピー
close FILE;         #ファイルのクローズ

まず、ファイルを開かなければいけません。
open関数を使って、open ファイルハンドル ファイルアドレス という順に記述をしていきます。
ファイルハンドルとは、この一連の操作に一時的につける名前であって、好きな名前で構いません。
ファイルアドレスは、絶対パスや相対パスで記述してやります。

次に、データのコピーですが、
<STDIN>のところで登場した、 <>演算子なるもの(名前は重要じゃありません)を再び使うことになります。
難しいことは考えず、<ファイルハンドル>とすれば自動的にデータが読めるので、それで構わないと思います。

最後に、ファイルを閉じるのですが、
これもファイルハンドルをcloseの後に書いてやれば完了です。

ファイル入出力にはいくつもの記述方法があります。
上に紹介したのはあくまで一例であって、別に他の記述をしても全然構いません。
現時点では、一通り型通りに覚えてしまえばそれでいいのではないでしょうか。

#ファイルへの書き込み

ファイルへの書き込みと一言にいっても、実は用途別に数種類あります。
具体的に、上書きモード、追記モード、更新モード等です。

とりあえず、一例として更新モードのサンプルを以下にあげてみます。

ex11.
open(FILE,"+<data.txt");  #まず、更新前の情報を読みとる
$data = <FILE>;

#何かの処理#

seek(FILE, 0, 0);  #書き込みの一連の処理
print FILE $data;
truncate(FILE, tell(FILE));
close (FILE);

seekとtruncate、tellは、元々はUNIXのコマンドから来ています。
とりあえずこの場では一連の書き方をそのまま覚えてしまいましょう。

更新する際にも、色々な記述方法があります。
seekで巻き戻してtruncateで消してやる方法がかなり高速な方法なので、
ここでのサンプルとして取り上げてみました。
(ただし、初心者にわかりやすいかどうかははなはだ疑問です)

第九章 デバッグ

Perlのデバッグの基礎知識をまとめてみます。

#文法チェック

perl -c 〜〜.cgi

とコマンドプロンプト上で打ち込むことによって、文法チェックを行うことができます。
これによって事前にソースコードに文法上のミスがあるか否か知ることができます。

#warning

perl -w 〜〜.cgi

とコマンドプロンプト上で打ち込むことによって、警告を表示させることができます。
これは、文法エラーではないが、何らかのミスではないかと疑われるものを表示する機能です。

#デバッガ

Perlにもデバッガが付属しています。

もっとも、使いこなすには相応の知識が必要ですし、
それを使わずに解決できてしまう(解決した方が早い)ものも数多くあります。
ここでは対象外ということで扱いません。

第十章 配列

スカラー変数は先に登場しました。
今回は二つ目の変数、配列が登場します。

#配列の特徴 〜数字で並んだ変数〜

配列とは、スカラー変数を複数並べて、順番に数字をわりふった変数のことです。
(この数字のことを日本語では添え字、英語ではindex(インデックス)と呼びます)
配列には「@」が頭につきます。

具体例で見ていきましょう。
出席番号を想像してみるとわかりやすいと思います。

ex.12
@name = ('satou', 'suzuki', 'tanaka');
print "一人目:$name[0]\n";
print "二人目:$name[1]\n";
print "三人目:$name[2]\n";

出力結果
一人目:satou
二人目:suzuki
三人目:tanaka

まず、@nameという配列を作成し、satou suzuki tanakaを順番に代入します。
すると、これに自動的に0から数字が割り振られます。
二行目以降、print文で個々に出力してやっています。

配列には、複数のスカラー変数を代入できるのだと解釈するのが一番簡単だと思います。
一度格納してしまえば、以後、その一部分をスカラー変数として個別に抜き出して使えるのです。
(個々に扱う場合は、$が頭につくことに注意してください)

#配列の操作 〜削除や追加〜

配列のデータを操作するための関数が何種類か用意されています。
ここでは基本的な4つを紹介しておきます。

shift 先頭のデータを削除
pop 最後のデータを削除

unshift 先頭にデータを追加
push   最後にデータを追加

ex13.
@data = ('one', 'two', 'three');
shift @data;
unshift (@data, "ten");
pop @data;
push (@data, "one");
print "$data[0] / $data[1] / $data[2]";

実行結果
ten / two / one

先頭を削除し、かわりにtenを追加。
最後を削除し、かわりにoneを追加。
という一連の操作を行っています。

plus one step.
・途中からの抜き出しはspliceを利用

#個別のアクセス 〜部分的な呼び出し〜

先に、配列の個々の要素をスカラーとして呼び出せると述べました。
ここではそんな個々の要素へのアクセスについて基本的なことをまとめてみます。

ex14.
@data = ('apple', 'orange');
$data[1] = 'grape';  #データの書き換え
$data[2] = 'melon'; #データの追加
print "$data[1]\n"; #データの出力

個別に配列の各要素を書き換える場合、その添え字を指定して代入を行います。
なお、存在していなかった添え字部分に代入してやると、新たにその部分が作成されます。

plus one step.
・配列の大きさ(長さ)は自由に変更可能です。

第十一章 ハッシュ

さて、最後の変数、ハッシュの登場です。
少し前までは連想配列と呼ばれていた変数の形式ですが、今ではハッシュという用語を使います。

#ハッシュの特徴 〜キーと対応する変数〜

配列は、スカラー変数を複数並べて、数字を割り振ったものだと先に説明しました。
今回登場するハッシュは、
複数のスカラー変数に対して、文字列(キーと呼ぶ)を割り振ったものです。

今回も具体例でみていくことにします。
ある人物のデータを%dataという名のハッシュにまとめてみます。

ex15.
%data = ("name","natsuki","age","21","mail","nodata");
print "名前:$data{name}\n";
print "年齢:$data{age}\n";
print "メール:$data{mail}\n";

出力結果
名前:natsuki
年齢:21
メール:nodata

Perlの変数に記号がつくことはそろそろお馴染みのことと思います。
ハッシュでは、%が先頭につきます。
(ただし、配列同様、データ一つ一つを指す場合には$を使います。)

ハッシュでは、キーと呼ばれる文字列に対して、なんらかの値を結びつけていきます。
上の例では、キー:nameに対して、値:natsukiが代入されています。
次に、 キー:ageに対して値:21、
そして最後に、 キー:mailに対して値:nodataが代入されています。

つまり、代入の際には 2個ずつ一セットでキー:値の順で並べて記述するということです。
まとめてハッシュに代入する場合は上のように一列に並べるのですが、
個別に代入する方法を次に紹介します。

ex16.
$data{name} = "natsuki";
$data{age} = "age";
$data{mail} = "nodata";

ex15の一行目をキーごとに書き換えるとこのようになります。
キーと値の結びつきがわかりやすくなったと思います。

plus one step.
・=>演算子をつかうと一括しての代入が綺麗にまとめられます。
・キーの削除にはdelete関数を使います。
・キーと値のセットは自由に追加が可能です。

#ハッシュの操作 〜ループに絡めて〜

実は、ハッシュそのもので特にこれといった操作をすることはあまりありません。
実際にハッシュが威力を発揮するのはループに絡んだときです。

まず、代表的な関数ですが、3種類紹介します。

keys ハッシュのキー部分のリストを返す
values ハッシュの値部分のリストを返す
each ハッシュの(キーと値の)ペアを返す

具体的に次のデータがあったとすると、
$data{one} = 'a';
$data{two} = 'b';
$data{three} = 'c';

それぞれの関数を使ったときに得られるデータは次のようになります。
keys %data    #one two three
values %data   #a b c        
each %data    #one a two b three c

ex17.
%data = (one,a,two,b,three,c);
foreach $part (keys %data){
 print "$part\n";
}

出力結果
one
two
three

keys %dataの箇所で、one two threeという文字列のリストを取得します。
そのリストに対してforeachループが実行され、
個々の値が改行つきで順番に出力されてるわけです。

plus one step.
・foreachではkeysやvalues、whileではeachを使う場合が多いです
・ハッシュのキーのリストは意味のある順番に並んではいません。

第十二章 サブルーチン

多くのプログラムには、サブルーチンを作る仕組みがそなわっています。
その名の通り、ソースコードの一部をまとめておくことで、
色々な場所からこのコードを呼び出すことが可能になります。

#書式 〜定義の仕方と呼び出し〜

定義
sub NAME{
  #サブルーチンの中身
  #計算なり、出力なり・・・。
}

NAMEという名のサブルーチンを宣言・定義しています。
ちなみに、慣用的には名称には小文字を使うことの方が多いようです。

呼び出し
&NAME;
NAME();

呼び出しは「&サブルーチン名」で呼び出すことができます。
また、()を後ろにつけることで、&を省略することができます。

#サブルーチンの機能 〜機能別観点から眺める〜

サブルーチンと一言にいっても、
機能面から眺めると、いくつかのパターンにわけられます。

ex.18 表示を代行するサブルーチン

#メインルーチン
&printline;
print "サブルーチン\n";
print "出力のサンプル\n";
&printline;
exit;

#サブルーチンの定義
sub printline{
 print "---------------\n";
}

実行結果
---------------
サブルーチン
出力のサンプル
---------------

サブルーチンの利用方法として、もっともシンプルなタイプは
表示を代行するために利用する方法です。

この例は、普通に書けば次のように書けます。
print "---------------\n";
print "サブルーチン\n";
print "出力のサンプル\n";
print "---------------\n";

この程度の記述量であれば個別に出力した方が早いですが、
大量の文字列や複雑な文字列等々を何回も出力する必要がある場合、
サブルーチンに分けてしまった方が楽になります。

ex.19 計算を行うサブルーチン

#メインルーチン
for ($k=1;$k<=3;$k++){
  $val = &calc($k, 3);
  print "$k^3 = $val\n";
}

#サブルーチン定義
sub calc{
  ($a, $b) = @_;
  $ans = $a ** $b;
  return $ans;
}

実行結果
1^3 = 1
2 ^3 = 8
3 ^3 = 27

さて、二つ目の利用方法ですが、なんらかの処理を一括して行わせるために
サブルーチンを用意することがあります。

上記の例では、累乗計算をサブルーチンにわけてあります。
それによって、メインルーチンのforループが簡潔に書けるようになりました。
(といっても、このくらいの処理であればわざわざ分けるメリットはほとんど無いのですけれども)

ところで、二つ新しい項目が登場しています。
ひとつは、@_という特殊変数で、これは@からもわかるとおり配列の一種です。
この特殊変数@_は、サブルーチンにわたされた値をリスト形式で取得したものです。

上の例では、&calc($k, 3)とサブルーチンが呼ばれています。
この際に、$kの値と、3という値が自動的に@_に代入されているのです。

また、サブルーチンの最後にreturn $ansというのがあります。
このreturnは、サブルーチンで得た値を、メインルーチンの呼び出し元に返してやります。

上記の場合では、計算結果$ansの値を呼び出しもと(&calcの行)に返してやっています。
そして、$val = (returnで戻ってきた値) が実行されて、$valに$ansが代入されているわけです。

なお、必ずしも値を返さなければいけないわけでもなく、
必ずしも@_を使って、渡されたものを受け取る必要もありません。
実際には、計算に限らず様々な処理をサブルーチンに振り分けていきます。

 

 

ページの最初へ / 文書展示エリア / 竜の情報館トップ , ご連絡      -- Copyright © ADRA 2003. All Rights Reserved. ++