1

複雑なデータ構造のすべての HTML エンティティをデコードしたいと考えています。基本的に、「スーパーマップ()」関数を探しています。これが私がこれまでに持っているものです:

sub _html_decode {
    my $self = shift;
    my $ref = shift;

    if (ref($ref) eq "HASH") {
        $self->_html_decode_hash($ref)
    }
    if (ref($ref) eq "ARRAY") {
        $self->_html_decode_array($ref);
    }

}

sub _html_decode_array {
    my $self = shift;
    my $ref = shift;

    unless (@$ref) {return;}

    foreach (0 .. (scalar(@$ref) - 1)) {
        if (ref($ref->[$_]) eq "HASH") {
            $self->_html_decode_hash($ref->[$_]);
        }
        if (ref($ref->[$_]) eq "ARRAY") {
            $self->_html_decode_array($ref->[$_]);
        }
        else {
            $ref->[$_] = decode_entities($ref->[$_]);
        }
    }
}

sub _html_decode_hash {
    my $self = shift;
    my $ref = shift;

    unless (%$ref) {return;}

    while (my ($k, $v) = each %$ref) {
        if (ref($v) eq "HASH") {
            $self->_html_decode_hash($v);
        }
        if (ref($v) eq "ARRAY") {
            $self->_html_decode_array($v)
        }
        else {
            $ref->{$k} = decode_entities($v);
        }
    }
}
4

3 に答える 3

3

任意の複雑なデータ構造のすべての要素に対してサブルーチンを実行するには、Visitor デザイン パターンを確認してください。基本的に、データ構造は、まだ処理する必要がある要素を認識し、サブルーチンをそれらに適用するオブジェクトです。方法を理解するため、そこには Iterator パターンも少しあります。

私のNetscape::Bookmarksモジュールに例があります。そのデータ構造は、いくつかの異なる種類のオブジェクトで深くネストされています。Visitor パターンを使用することで、複雑さのほとんどが解消されました。

それに加えて、私のObject::Iterateモジュールをチェックしてみてください。リストの代わりにオブジェクトを操作するimap機能があります。のアイデアを__next__Python から盗み、Perl に適用しました。

于 2008-12-17T19:45:00.560 に答える
2

Data::Rmapもこれを行うようです。このモジュールの経験がある人はいますか?

于 2008-12-18T01:01:15.663 に答える