小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

Tie::Expressionモジュールの私的説明メモ

Tie::Expressionモジュールは、文字列中で式を実行したい時に使えます。

小飼氏は『仕組みは、呆れるほど簡単です。』との事でしたが・・・私にとっては、呆れるほど難しいかったので調べてみました。

モジュール使用例ソース

use Tie::Expression;
tie my %expression, 'Tie::Expression';
print "PI = $expression{ 4 * atan2(1,1) }.\n";
http://blog.livedoor.jp/dankogai/archives/51074461.html

モジュールソース

package Tie::Expression;
use warnings;
use strict;
our $VERSION = sprintf "%d.%02d", q$Revision: 0.1 $ =~ /(\d+)/g;
sub TIEHASH($) { bless \eval { my $scalar }, shift }
sub FETCH($$) { $_[1] }
1;
http://blog.livedoor.jp/dankogai/archives/51074461.html

モジュール使用例ソース説明

  • use Tie::Expression;
    • モジュール「Tie::Expression」を使用(インポート)する。
    • 「Tie::Expression」は、TieフォルダにあるExpression.pmのこと。
  • tie my %expression, 'Tie::Expression';
    • tie関数でハッシュ変数(%expression)を使用する際に内部的なトリガーにTie::Expressionクラスを結合(tie)する。
    • Tie::Expressionクラスは、tie関数ハッシュ変数専用のクラス(TIEHASHやFETCH等がある)
  • print "PI = $expression{ 4 * atan2(1,1) }.\n";
    • 文字列中で式「4 * atan2(1,1) 」を実行。
    • アークタンジェントで円周率を求める定石らしい。

モジュールソース説明

  • package Tie::Expression;
  • our $VERSION = sprintf "%d.%02d", q$Revision: 0.1 $ =~ /(\d+)/g;
    • パッケージバージョンのお約束?(実処理には影響しない?)
    • ちなみに、コマンドラインから以下のコマンドで、$VERSIONの値が取得できる。
    • D:\test>Perl -MTie::Expression -e "print $Tie::Expression::VERSION"
    • WINDOWSコマンドプロンプトでは、なぜかシングルクォートはNG。
    • しかし、なぜ、our $VERSION = '0.01'; と素直に書かない?
    • ちなみに、q$Revision: 0.1 $は、qのあとにスカラー変数があるのでなく、'Revision: 0.1 'の文字列と等価。
    • そして、q$Revision: 0.1 $ =~ /(\d+)/g; が評価されると、真理値でなく、マッチ文字列が返る?
    • またちなみに、(\d+)の小括弧は、無くても大丈夫みたい?
  • sub TIEHASH($) { bless \eval { my $scalar }, shift }
    • これは、オブジェクトのコンストラクタで、tie関数実行時に呼ばれる。
    • evalでリファレンスしているのは、単なるレキシカル変数$scalarのリファレンスが欲しいだけ?
    • そして、shiftでクラス名が渡されて、blessされたリファレンスになるので、Perlでのオブジェクトとなる。
    • TIEHASH($)の$は、プロトタイプ指定で、スカラー引数が1つの場合。
    • ちなみにその引数には、'Tie::Expression'の文字列が渡される。
  • sub FETCH($$) { $_[1] }
    • 本関数は、tieした変数が使用されるときに起動される。
    • FETCH($$)の$$は、プロトタイプ指定で、スカラー引数が2つの場合。
    • 1つ目の引数($_[0])は、TIEHASHでコンストラクタされたオブジェクトが渡される。
    • 2つ目の引数($_[1])は、4 * atan2(1,1)で計算された3.14159265358979が渡される。
    • そして、2つ目の引数をそのまま、リターン値としている。
  • 1;
    • モジュールのお約束事(真値を返す)

尚、tie関数に関しては、後日、別途説明したいと思います。