tie

変数をオブジェクトクラスにバインドする

構文

解説

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;

データベースファイルが大きい場合、keysvalues は巨大なリストを返すことになり、 膨大なメモリリソースを消費してしまいます。 そのような状況では、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;

tiedbmopen と用途が非常によく似ています。 しかし、dbmopen は DMB のモジュールをロードする必要がなかったのに対し、 tie は明示的に DMB のモジュールをロードする必要がありますので注意してください。 その代わり、tie では我々が DMB の種類を指定することができます。 さらに、パッケージクラスが対応していれば、連想配列だけでなく、配列なども扱える点がメリットと言えるでしょう。