変数をオブジェクトクラスにバインドする
tie
はパッケージクラスに変数をバインドします。
パッケージクラスは tie
で変数にバインドされるよう作られている必要があります。
主に DB_File (Berkeley DB version 1.x) や
NDBM_FILE などで使われます。
VARIABLE にはバインドしたい変数を、
CLASSNAME にはオブジェクトを実装しているクラス名を指定します。
LIST には、バインドに使うパッケージクラスのパラメータとして使われるため、
その内容はパッケージクラスによって異なります。
次のコードは、NDBM_FILE を使って連想配列をバインドし、新たなレコードを追加しています。
use Fcntl;
use NDBM_File;
# ndbm で連想配列をバインド
tie my %data, 'NDBM_File', 'sample', O_RDWR | O_CREAT, 0666
or die "Couldn't tie NDBM file 'filename': $!; aborting";
# レコードを追加
$data{name} = 'Taro';
# バインドを解除
untie %data;
データベースファイルが大きい場合、keys
や
values
は巨大なリストを返すことになり、
膨大なメモリリソースを消費してしまいます。
そのような状況では、each
を使ってレコードを逐次処理するのが良いでしょう。
use Fcntl;
use NDBM_File;
tie my %hugedata, 'NDBM_File', 'hugedata', O_RDWR | O_CREAT, 0666;
while ( my ( $key, $val ) = each %hugedata ) {
print "${key}: ${val}\n";
}
untie %hugedata;
tie
は dbmopen
と用途が非常によく似ています。
しかし、dbmopen
は DMB のモジュールをロードする必要がなかったのに対し、
tie
は明示的に DMB のモジュールをロードする必要がありますので注意してください。
その代わり、tie
では我々が DMB の種類を指定することができます。
さらに、パッケージクラスが対応していれば、連想配列だけでなく、配列なども扱える点がメリットと言えるでしょう。