2008年5月 2日

[Namazu-devel-ja 1738] Re: nmzcat と %FIELD_ALIASES と変数の初期化

臼田です

分析ありがとうございます。
nmzcat のときだけワーニングがでるファイルがあって気になっていた
ところでしたので理解できました。

Tadamasa Teranishi さんは書きました:
> nmzcat は %FIELD_ALIASES (つまり、フィールドの別名)を考慮していない

> ようです。このため、
>
> $ nmzcat msg00000.html
>
> では、author が取り出せていません。
>
> $Document->get_field_info('author');
>
> で、直接 $self->{'_field_info'}{author}; を参照しています。
> 多くのメディアタイプでは author に著者が入りますが、mhonarc.pl では
> from に著者が入るためです。
>
>
当初の成り立ちからか html と mhonarc フィルタ関連には特別の機能がありま
すね。

> これはこういう仕様だと考えて、nmzcat に "from:" の表示も追加すると
> いう方法もありますが、$self->{'_field_info'} が %FIELD_ALIASES を
> 考慮した方が良いのではないかと思います。
>
> %FIELD_ALIASES を考慮しようとすると、mknmz の
> complete_field_info と clean_field_index に相当する処理を行った上で
> get_field_info でエイアスの参照を行う必要があるでしょう。
> # complete_field_info は必要ないかもしれませんが。
>
nmzcat の動作の改善は必要ですが、
nmzcat は mknmz::document, mknmz::filter を mknmz 以外のスクリプト
からも簡単に活用できることを示すサンプルという位置づけがよいかと
思っています。
できれば pl/document.pl の get_field_info 側で対応しておきたいですね。

> ところで、development-2-1 の html.pl の htmlparser_filter では、
> $fields->{'title'}, $fields->{'author'} を undef で初期化しています。
>
> このため、init_doc で行った '_field_info' の初期化を壊すので、
>
> $ nmzcat msg00000.html
>
> では、$self->{'_field_info'}{author} が未定義となるため、
>
> Use of uninitialized value in concatenation (.) or string at
> /usr/local/bin/nmzcat line 82.
>
> が発生します。
> undef で初期化している部分をコメントアウトすれば、このエラーは
> 消えますが、htmlparser_filter 内の処理で $fields->{'title'},
> $fields->{'author'} は undef で初期化していることが前提のようなので、
> 別の問題がでそうです。
>

undef でなく "" で初期化することにして、値が入っていることを確認する

if (!defined $html::fields->{'author'})

といったところを

if ($html::fields->{'author'} eq "")

とすればよいですかね。

HTML::Parser から undef が返ってくることがあったのでこうして
いたような気もしますが、 undef が返ってきたときには
入力しないようにしていれば、空文字列で判断するように
なおしてよいと思います。

臼田幸生

_______________________________________________
Namazu-devel-ja mailing list
Namazu-devel-ja@xxxxx
http://www.namazu.org/cgi-bin/mailman/listinfo/namazu-devel-ja

投稿者 xml-rpc : 2008年5月 2日 12:11
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/72772
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。