0

尝试从以下 DoxyDocs1.pm 文件中的详细 -> 文档 -> 参数 -> 参数 -> 名称中提取数据;还包括提取一些数据的脚本示例,但在提取参数 -> 参数 -> 名称时遇到问题。取消注释评论部分以查看数据。

#!/bin/perl
use Data::Dumper;
use warnings;
require "DoxyDocs1.pm";
print "API Content Analyzer\n";
&GenerateClassInfo($doxydocs->{classes});
sub GenerateClassInfo()
{
    my ($classes) = @_; 
    foreach my $class (@$classes) {
    print "\nClass name is: $class->{name}\n";
    foreach my $pubmeth (@{$class->{public_methods}->{members}}) {
       print "\n" if exists $pubmeth->{name};
       print "\tpublic methods include: $pubmeth->{name}\n";
       my ($key, $pmcontent) = each (@{$pubmeth->{detailed}->{doc}});
       print "\t\tdescription: $pmcontent->{content}\n" if exists $pmcontent->{content};
       # foreach my $pmp (@{$pubmeth->{detailed}->{doc}}) {
         # print "\t\t";
         # print Dumper($pmp);
       # }
       print "\t\tkind: $pubmeth->{kind}\n";
       print "\t\ttype: $pubmeth->{type}\n" if exists $pubmeth->{type};
    }
    foreach my $privmeth (@{$class->{private_methods}->{members}}) {
        print "\n" if exists $privmeth->{name};
        print "\tprivate methods include: $privmeth->{name}\n";
        my ($key, $pmcontent) = each (@{$privmeth->{detailed}->{doc}});
        print "\t\tdescription: $pmcontent->{content}\n" if exists $pmcontent->{content};
        # foreach my $info (@{$privmeth->{detailed}->{doc}}) {
         # print "\t\t";
         # print Dumper($info);
        # }
        print "\t\tkind: $privmeth->{kind}\n";
        print "\t\ttype: $privmeth->{type}\n" if exists $privmeth->{type};
    }       
  }
}

示例 DoxyDocs1.pm 文件

$doxydocs=
{
  classes => [
    {
     name => 'Panoply::Composite',
     public_methods => {
     members => [
      {
        kind => 'function',
        name => 'addChild',
        virtualness => 'non_virtual',
        protection => 'public',
        static => 'no',
        brief => {},
        detailed => {
          doc => [
            {
              type => 'text',
              content => 'Add a child to the container '
            },
            params => [
              {
                parameters => [
                  {
                    name => 'child'
                  }
                ],
                doc => [
                  {
                    type => 'text',
                    content => 'is the child element to add'
                  }
                ]
              }
            ]
          ]
        },
        type => 'void',
        const => 'no',
        volatile => 'no',
        parameters => [
          {
            declaration_name => 'child',
            type => 'Ptr'
          }
        ]
      },
      {
        kind => 'function',
        name => 'operator<',
        virtualness => 'non_virtual',
        protection => 'public',
        static => 'no',
        brief => {},
        detailed => {
          doc => [
            {
              type => 'text',
              content => 'Less than operator'
            },
            {
              type => 'parbreak'
            },
            params => [
              {
                parameters => [
                  {
                    name => 'rval'
                  }
                ],
                doc => [
                  {
                    type => 'text',
                    content => 'The '
                  },
                  {
                    type => 'url',
                    link => 'classPanoply_1_1Package',
                    content => 'Package'
                  },
                  {
                    type => 'text',
                    content => ' against which we are comparing this one. '
                  }
                ]
              }
            ],
            {
              return => [
                {
                  type => 'text',
                  content => 'true if this.packageID < rval.packageID, false otherwise.'
                }
              ]
            }
          ]
        },
        type => 'bool',
        const => 'yes',
        volatile => 'no',
        parameters => [
          {
            declaration_name => 'rval',
            type => 'const Composite &'
          }
        ]
      },
    ]
  },
  private_methods => {
    members => [
      {
        kind => 'function',
        name => 'addChild',
        virtualness => 'virtual',
        protection => 'private',
        static => 'no',
        brief => {},
        detailed => {
          doc => [
            {
              type => 'text',
              content => 'Add a child to the container '
            },
            params => [
              {
                parameters => [
                  {
                    name => 'child'
                  }
                ],
                doc => [
                  {
                    type => 'text',
                    content => 'is the child element to add '
                  }
                ]
              },
              {
                parameters => [
                  {
                    name => 'parent'
                  }
                ],
                doc => [
                  {
                    type => 'parbreak'
                  },
                  {
                    type => 'text',
                    content => 'is this own parent, except in weak pointer format to avoid a memory leak'
                  }
                ]
              }
            ]
          ]
        },
        type => 'virtual void',
        const => 'no',
        volatile => 'no',
        parameters => [
          {
            declaration_name => 'child',
            type => 'Ptr'
          },
          {
            declaration_name => 'parent',
            type => 'Ptr'
          }
        ]
      },
    ]
  },
    }
  ]
 };
1;
4

1 回答 1

1

你说你想要

detailed -> doc -> params -> parameters -> name 

但这缺少许多索引。哪个doc,你想要吗paramparameters

detailed -> doc -> ??? -> params -> ??? -> parameters -> ??? -> name

语法是:

$member->{detailed}->{doc}->[$i]->{params}->[$j]->{parameters}->[$k]->{name}

或简称:

$member->{detailed}{doc}[$i]{params}[$j]{parameters}[$k]{name}

如果要遍历每个文档、参数、参数,可以使用:

my $docs = $member->{detailed}{doc};
for my $doc (@$docs) {
   my $params = $doc->{params};
   for my $param (@$params) {
      my $parameters = $param->{parameters};
      for my $parameter (@$parameters) {
         ...
      }
   }
}

(为什么doc是单数而params和parameters是复数???为什么params有参数???)

于 2012-06-23T04:25:42.137 回答