「初めてのPerl第3版」(リャマ本)読書ログ – 第16章「単純なデータベース」

初めてのPerl

perlはシンプルなデータベースであるDBMがデフォルトで利用できる.DBMのデータベースは,my_database.dirとmy_database.pagという2つのファイルからなる.DBMの利点は,perlプログラム上でハッシュと同じようにDBのコンテンツを扱えることにある.

[perl]
dbmopen(%DATA, "my_database", 0644) #my_databaseというDBMをオープンする
or die "Cannot create my_database: $!";

$DATA{"fred"} = "bedrock"; #DBMへのデータ追加
$DATA{"barney"} = "hoge";
remove $DATA{"barney"}; #DBMからのデータ削除

foreach my $key (keys %DATA) {
print "$key\n";
}
[/perl]

なお,データ数が増えるほど,keysを使ってハッシュのキーリストを得る処理は重くなる可能性がある.keysはハッシュ全体をスキャンするので,大きなリストを生成するかもしれないから.DBMハッシュをスキャンするときは,一般には,each関数を使った方がメモリの使用量が少なくて済む.

[perl]
while( my($key, $value) = each(%DATA)) {
print "$key has value of $value\n";
}
[/perl]

データをDBMに格納する際,1つのキーに対して複数の値を格納したいときは,pack/unpack関数を利用する.packは,フォーマット文字列と引数のリストを受け取って,それらをもとに1個の文字列を生成する.

[perl]
my $buffer = pack("c s l", 31, 4159, 263539);
my($char, $short, $long) = unpack("c s l", $buffer);#charには31, shortには4159, longには263539が入る
[/perl]

DBMはいうなれば巨大なハッシュだったが,他にも固定長や可変長のテーブルを利用することができる.固定長テーブルと可変長テーブルについての解説は必要になれば追記する.

perlはちょっとした処理を行う為に,一行のプログラムをさくっと実行するモードを用意している.

[perl]
$perl -p -i.bak – w -e ’s/Rnadall/Randal/g’ fred*.dat
[/perl]

-pオプションは以下のようなプログラムを追加する処理をする.

[perl]
while(<>) {print;}
[/perl]
-eオプションで指定されるのが,実行して欲しいプログラムとなる.これが,上のwhile(<>)内に入ると考えれば良い.-i.bakオプションは,実行前に$^Iに.bakをセットする.これはすなわち,ダイアモンド演算子で指定されたファイルのバックアップファイルの拡張子として,.bakを利用する,というものである.-wオプションは,先に述べた通り,警告を出させる.-eオプションの次に来るfred*.datがプログラムに対する引数となる.

Tags: , , ,

Leave a Reply