making-treeで、木情報を作成するPerlスクリプトを作成しました。
このスクリプトで取り扱っている木情報の構造は⬇でした。
データの構造
親nodeが子nodeを複数持つ下の形式で表現します。
nodeに続く最初の数字が、木の深さ、続く数字で同じ深さにいる兄弟ノードを識別します。
木の形式
node.木の深さを表す数字(0より始まる).兄弟番号(0より始まる)
{
hogehoge(<-nodeのメンバ)
node.木の深さを表す数字+1.兄弟番号(0より始まる)
{
hogehoge
}
node.木の深さを表す数字+1.兄弟番号+1
{
hogehoge
node.木の深さを表す数字+2.兄弟番号(0より始まる)
{
hogehoge
}
}
}
ex. 深さ2の木、各ノードには、二つの子ノードがいる。
node.0.0
{
hogehoge
node.1.0
{
hogehoge
node.2.0
{
hogehoge
}
node.2.1
{
hogehoge
}
}
node.1.1
{
hogehoge
node.2.0
{
hogehoge
}
node.2.1
{
hogehoge
}
}
}
leafを取り出す
今までは、子nodeを保有するnodeを抽出したりしたのですが、今回は、
子nodeを持たないnode( =leaf )を抽出するスクリプトを考えてみます。
作成するプログラムのアウトライン
アイディアとしては、
解析中のnodeから別のnodeへ、解析関数が再帰しなければ、
子nodeがない、leaf だと判断する。これでいけそうです。
ここまでは単純。
nodeの定義終端 "}" まで、一度、解析する必要があるので、
leafと判断したnodeを連想配列(キー:node( =leaf )名、値:ファイルポインタ)へ追加。
再度、木情報を読み取り、連想配列から取得するファイルポインタを使ってSEEK。
そこからleaf情報を抽出といった段取りでオッケー牧場な感じです。
プログラム
上の動作を実現するPerlスクリプト( drip_leaf.pl )を⬇に貼付けます。
あと、木情報( tree:深さ4)も貼付けておきます。
下記の環境で動作してます。
Mac OS X 10.9
perl --version
This is perl 5, version 12, subversion 4 (v5.12.4) built for darwin-thread-multi-2level
$perl drip_leaf.pl tree > dripped_leaf
で、ファイルdripped_leafに、leafを抽出した情報が出力されます。
treeは、木構造をもつデータファイル
dripped_leafは、leafを抽出したファイル