メメメモモ

プログラミング、筋トレ、ゲーム、etc

タイ変数に付いて

perlには、変数の代入/参照が行なわれた際に実行する関数を結びつける機能があります。
この機能を実現するためにtie関数を使用します。
例えば、MyScalarモジュールと$scalar変数を結びつけるには次のように記述します。

tie $scalar, MyScalar;


MyScalarに実行するメソッドを定義していきます。
例えば、変数への代入の際に実行する関数は、STOREというメソッド名で定義します。
変数の参照の際に実行する関数は、FETCHというメソッド名で定義します。
こういったメソッドは、必ず一通り定義しなければなりません。
そこで、Tie::Scalarというモジュールを継承するようにして、自分が定義したいメソッドだけ記述できるようにします。

package MyScalar;
use strict;
use warnings;
require Tie::Scalar;
@ISA = qw/Tie::StdScalar/;

1;


上記の定義で、MyScalarはスカラー変数にtieするモジュールとして機能するようになります。
独自の実装したい場合は、オーバーライドします。
代入する毎に値を表示するにはSTOREメソッドをオーバーライドします。

package MyScalar;
use Carp;
require Tie::Scalar;
@ISA = qw/Tie::StdScalar/;

sub STORE {
   my ( $this, $value ) = @_;
   carp "$$this -> $value";
   $$this = $value;
}
1;

package main;
use strict;
use warnings;
use MyScalar;

tie my $scalar, 'MyScalar';
$scalar = 1;
$scalar = 2;


スカラー以外の変数にtieするモジュールも作成できます。
そのときには、Tie::Array、Tie::Hash、Tie::Handleをベースクラスとして使用できます。

参考