1部 Perl入門

Perlクイックリファレンス

1.文字列の出力

文字列を出力するには、print関数を使います。

print "Hello world!\n";
>Hello world!

出力文は、カンマ( , )で区切ることもできます。

print "Hello world!", "\n";
> Hello world!

2.変数と代入演算子

計算した結果を変数に代入することもできます。

$x = 10 + 3 -1; # $x は「12」

+ や - などの記号を『演算子』といい、特に上記のような計算に使う演算子を『算術演算子』と言います。

Perl の変数には、スカラ変数、配列変数、ハッシュ変数というデータ型があります。変数のデータ型は変数名の前に付く1文字で区別されます。スカラ変数の場合はダラー( $ )、配列変数はアットマーク( @ ) 、ハッシュはパーセント( % )が変数の先頭に付きます。

文字 意味
スカラ $ $value 1つの変数で1つの値を記録します。
配列 @ @value 配列はスカラ変数のリストです。個々のスカラには、0から始まる数字のインデックスを使ってアクセスすることができます。
ハッシュ % %value ハッシュは、複数のスカラをキーと値のペアによって格納する変数です。配列とは違って順番がなく、キーを指定して個々のスカラにアクセスします。
型グロブ * *glob glob という名前を持つ変数すべてを意味します。

変数は以下のように値を代入したり出力することができます。

# 変数に文字列を代入
$value = "テストです";
# 変数を出力
print $value;
【参照ページ】

配列

複数の値を1つの変数で管理したい場合は、『配列』という変数が最適です。

配列を初期化する場合は、要素をカッコで囲み、各要素毎にカンマで区切ります。

@week = ('日曜', '月曜', '火曜', '水曜',
'木曜', '金曜', '土曜');

配列はインデックスを使って参照します。インデックスは 0から始まるので注意してください。たとえば1番目のデータ "日曜" を呼び出すときは、$week[0]、"月曜"なら $week[1] とします。

# 配列 @week の1番目の要素を表示
print $week[0], "\n";
> 日曜
# 配列 @week の2番目の要素を表示
print $week[1], "\n";
> 月曜
【参照ページ】

ハッシュ

配列と同じように、関連ある複数のデータをまとめて扱うことのできる変数があります。それが『ハッシュ』です。配列はインデックスで値を管理していましたが、ハッシュはキーで値を管理します。配列と比べたときのハッシュの利点は、キーで値を管理できるので、可読性が高くなることにあります。

%week = (
	'Sun' => '日曜',
	'Mon' => '月曜',
	'Tue' => '火曜',
	'Wed' => '水曜',
	'Thu' => '木曜',
	'Fri' => '金曜',
	'Sat' => '土曜',
);

配列では、[ ] でインデックスを囲みましたが、ハッシュは、 { } でキーを囲みます。

print $week{'Sun'};
> 日曜
【参照ページ】

3.式と項

****

4.制御文の使い方

条件文

「もし~ならば、・・・を実行する」という条件つき命令は、プログラムの流れを制御するときによく利用されます。

次の使用例は、変数の値によってメッセージを変えています。

if ( $var eq 'A' ) {
	print "Aです";
} elsif ( $var eq 'B' ) {
	print "Bです";
} else {
	print "AでもBでもない";
}

ループ文

配列の値すべてに処理したいとき、foreach が便利です。foreachは、リストの1番目から順番に変数に代入していき、ブロックを実行します。リストが終了した時点で繰り返しが終了されます。

@week = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
foreach $value( @week ) {
  print $value, "\n";
}
> Sun
> Mon
> Tue
> Wed
> Thu
> Fri
> Sat
【参照ページ】

5.ファイル入出力

ファイルを読み込むには open 関数を使います。open
関数の引数には、ファイルハンドルとファイルパスを渡します。

# 読込用にファイルを開く
open FH, "< filename.txt";

ファイルの1行目を読み込むには、ファイルハンドルを利用して次のように記述します。

$in_line = <FH>;

すべての行を読み込んだり出力するには、while 文を使います。

構文

while (条件式) { 真のとき繰り返す }

条件式が真の間、ブロックを実行します。判定はループの最初に行われます。ループの間条件が決してFALSEにならない場合、命令が永遠に実行されます。

入力「<>」を while(<>) のように使うと、特殊変数 $_に読み込んだ行が入るようになっています。

open( DAT, "test.dat" );
while ( <DAT> ) { # "test.dat"を1行ずつ読み、出力する
    print $_, "\n";
}
close( DAT );

ファイルを出力したい場合は、読み込むときと少し勝手が違います。読み込む際はファイル名の前に <という記号をつけていましたが、書込みの場合は > という記号をつけます。

# 書込み用にファイルを開く
open FH, "> filename.txt";
# データを出力
print FH $line;
close( FH );
【参照ページ】

当然のことですが、ファイルを扱う際には、ファイルにしかるべきパーミッションが設定されている必要があります。

ファイルの読み書きをする際の手順は下記のとおりです。

  1. ファイルを開く(open)
  2. ファイルの内容を読みこむ/ファイルに書き込む(print など)
  3. ファイルを閉じる(close)

openの際に、ファイルに対するアクセスの種類を決定します。具体的には、読み込みだけなのか、ファイル末尾に書き込むのか、ファイルを新規に作成してから書き込むのか、などです。openの第二引数がその指定です。詳しくは perldocやリファレンスを見ていただきたいのですが、下の例では、読み込みだけ( "<ファイル名" ) で openしています。

下の例は、UNIX コマンドの catのように、あるファイルの内容を行番号をつけて表示するプログラムです。複数のファイルが指定されれば、それらを次々に表示します。

ファイルの読み込み

foreach $fname ( @ARGV ) {
	print "--------- $fname ---------\n";
	open FP, "<$fname" or die "File Open Error.\n";
	while( <FP> ) {
		$counter++;
		print "$counter : $_\n";
	}
	close FP;
	counter = 0;
}

foreach ループでコマンドラインから引数で与えられたファイル名を取り出し、 whileループで、ファイルの内容を一行ずつ取り出し、すべての行を読み終えるまで処理しています。この while書き方は常套句なので、覚えておきましょう。$_ に、そのとき処理中の一行がそのまま入っています。

ファイルの書き込み

ファイルに書き込む際には、追記モード('>>ファイル名')と新規モード('>ファイル名')があることを知らねばなりません。

詳しくは関数リファレンスの open の項をご参照願いたいのですが、新規モードにすると、openの前にファイルに書き込まれていた内容は消去されてしまいます。
追記モードは既存のファイルに追加して書き込んでいく際に使われます。普通にすればファイルの末尾に書かれていきます。

以下、$dataというリストの内容をファイルに書き出していくサンプルです。ここでは新規モードでファイルをオープンしています。

open FP, ">/tmp/hoge.txt" or die
"Can't Open File.\n";
foreach $item (@data) {
	print FP $item . "\n";
}
close FP;

6.サブルーチンの作成と使用法

サブルーチンとは、決まった処理をプログラムの別のところに記述しておき、使う際にパラメータを渡したりすることができます。また、サブルーチンからサブルーチン内で処理した結果の値を関数の呼び出し元に返すことができます。それをサブルーチンの戻り値(返り値)といいます。

サブルーチンの宣言は下記のようにします。

sub func_test {
  my ($arg1, $arg2) = @_;
  return $arg1 + $arg2;
}

2 行目の代入文は、配列 @_ の内容を、順に $arg1 と $arg2にそれぞれ代入する、という意味です。この 2 行目の時点では、@_には、引数のリストが入っています。

サブルーチンを呼び出すときは、下記のようにします。

$sum = func_test(1, 2);

上記の結果は、$sumに 1 + 2 の結果、3 が代入されます。
 

関連記事