Camille note
■index ■about ■Perl ■Eushully ■diary ■mail ■link
テキストの処理に強い言語らしい.
インタプリンタ型でコンパイルが不要,非常に助かる.
またUNIXのコマンドをプログラム内で使用できるので,
複数のコマンドまとめたり,繰り返したりできる
(ちなみに俺はコレのためにPrelを始めた).
cと似た表記でありながら,細かい制約(変数の型等)が無く,cと比べて扱いやすい印象を受けた.
むしろ正確に動作してくれるのか不安になったほど簡単(Perlを作った人からすれば,大きなお世話だろうが).
そんなわけでプログラミング初心者には向いていない言語.
Perlを最初に勉強したら,cなんか面倒で覚えられないだろう.
LinuxにPerlがインストールされているか確認する
コマンドプロンプトで次のように入力する
%>perl -v
インストールされていれば,おおよそ次のような表示が返ってくる.
This is perl, v5.6.1 built for cygwin
(with 1 registered patch, see perl -V for more detail)
後で利用するのでPerlのパスも調べておく.
%>which perl
俺の場合は/usr/bin/perlだった.
例によって"hello world"させてみる.
ソースは次のとおり
#! /usr/bin/perl
#hello world
print ("hello world\n");
この3行のソースを「hello_world.pl」という名前で保存する(.plはperlの拡張子).
内容を見てみると,一行目に#!に続いて,
先に調べたperlのパスが書かれている.
この記述によって,通常は
%>perl hello_world.pl
と入力して実行するところを(先に述べたようにコンパイルは不要),
%>hello_world.pl
のようにソースファイル名のみで実行できる.些細な短縮のようだが,非常にありがたい機能.
2行目はコメント行.ここではプログラムの名前を書いている.
#以下がコメントになる.cの//と同じ.
ただし,複数行をまとめてコメント化する機能は無い.
3行目はprint文.cとほぼ同じで" "の中身が表示され,\nで改行.
ライブラリの読み込みもmain関数も無いので簡単.
変数を扱ってみる.
例として次のプログラムを実行してみる.
#! /usr/bin/perl
#age
$name="Camille";
$age=17;
print ("$name : $age");
実行結果は
Camille : 17
となったはずである.
ここでは,先頭に$を付けた文字列が変数として扱われることと,
変数を使用する際,型宣言が必要ないということを
確認してもらいたい.
3,4行目で,2つの変数に文字列と整数を代入し(文字列を代入する場合,""で囲む),
続くprint文でこれらを表示している.
型を決めていない変数が,正しく処理されるか確認するため,4行目と5行目の間に
$age=$age+12.3;
$name=$name+$age;
と加えて実行してみる.
一つ目は整数の入っているageという変数に,実数12.3を加えている.
二つ目は文字列nameと数値ageを足している(足す?).
どちらもcならば,コンパイルエラーが生じるだろう.
実行結果は29.3 : 29.3となった
整数と実数の計算は正しく処理されている.文字列と数値の計算は文字列を無視する形で実行してくれた.
プログラマがおかし命令を書いても,ある程度実行してくるれるようだ.
prelでは,変数の型を決めないので,数字は数としても文字列としても処理できる.
次のプログラムを実行してみる.
#! /usr/bin/perl
#compare
$a="1";
$b="01";
if ($a == $b){
print ("[i] $a = $b\n");
}
if($a eq $b){
print ("[a] $a = $b\n");
}
[i] 1 = 01と表示されるはずである.
if文はcとほぼ同じ.
今,変数aには"1",bには"01"が,それぞれ文字列として代入されている." "が無ければ数として代入される.
5行目では==でaとb比較している(これもcと同じ)ので,
1と01は数として扱われる.prelはその辺り柔軟.
1と01は数としては等しいので,次のprint文が実行される.
次に8行目を見ると,eqを用いている.
これは変数a,bを文字列として比較する文である.
当然"1"と"01"は違うので,9行目のprint文は実行されない.
文字列を扱う例をもう一つ
#! /usr/bin/perl
#v
$name="RX-78-";
for($i=1;$i<4;++$i){
$temp=$name . $i;
print("$temp \n");
}
実行すると
RX-78-1
RX-78-2
RX-78-3
と表示される.
重要な部分は,for文の2行目.
A=B.Cは,
"文字列Bの後ろにCを繋げて,Aに代入する”という処理をしてくれる.
今回はCにあたる変数iが,文字列でなく数値であったわけだが,先に確認したように上手に対応してくれている.
UNIXコマンドが利用できるsystem関数を紹介する.
コマンドライン操作を自動化する際に非常に便利(俺はコレを利用するためだけにperlを始めた).
system関数を利用した簡単なプログラムを動かしてみる.
#! /usr/bin/perl
#pwd
system="pwd";
このプログラムを実行したら,コマンドラインからpwdを実行してみる.
同じ結果が返ってくるはず.
おそらくコマンドライン上からの作業は,すべて再現できる.
ちなみに俺はcで作ったプログラムの動作を確認する際,
%>gcc sample.c
%>./a.exe
と,ソースを編集する度に2回の入力をするのが面倒だったので,
2つのコマンドをまとめたperlプログラムを作ってみた.
が,たいていコンパイルエラーになるので作業効率は変わっていない
system関数の引数(?)には,変数も利用できる.
先ほど文字列操作の説明で利用した,2つ目のサンプルプログラムに少し手を加えて
#! /usr/bin/perl
#auto
$command="mkdir perl-"; #変数を実行されるコマンドに変更
for($i=1;$i<4;++$i){
$temp=$command . $i;
system"$temp"; #print文をsystem関数に変更
}
として実行してみる.新しいディレクトリ
perl-1 perl-2 perl-3
できているだろう.
このような具合で,コマンドライン上の操作を自動化することができる.
プログラムの計算時間の測定などに役立つだろう.
時間があったら,その辺りを詳しく書いて,ソースも紹介したいと思う.
推奨環境 FireFox 2.0 以降 (IEだと乱れるかも)