Perl 如何检索方法';从REPL或调试器中删除POD?

Perl 如何检索方法';从REPL或调试器中删除POD?,perl,Perl,我希望在REPL或debuger中使用某个方法/函数时能够看到它的文档 是否有任何模块允许您在使用REPL或调试程序时查看函数的文档 显然,如果该模块存在,它会要求您使用可解析结构的POD和代码来提取文档。这不是一个问题,因为我有我所有的代码文档,我可以适应任何需要。目前,我的所有方法都有一个前面的POD,其中包含一个=head2 method\u name,以及名称、用法、示例、args、return、execptions等的典型行 典型的例子是,当您在调试程序(或REPL)中,想要使用一个函

我希望在REPL或debuger中使用某个方法/函数时能够看到它的文档

是否有任何模块允许您在使用REPL或调试程序时查看函数的文档

显然,如果该模块存在,它会要求您使用可解析结构的POD和代码来提取文档。这不是一个问题,因为我有我所有的代码文档,我可以适应任何需要。目前,我的所有方法都有一个前面的POD,其中包含一个
=head2 method\u name
,以及名称、用法、示例、args、return、execptions等的典型行

典型的例子是,当您在调试程序(或REPL)中,想要使用一个函数时,您不记得参数的顺序或它们的类型,或者返回元素的类型,或者您想要一个用法提示

我想要一些像get_pod($moudle_bar,$method_foo)的东西,或者更好的是能够将get_pod放在基本模块中,并且能够说
$bar->get_pod('foo')
。我知道这不是一件小事,而且有很多小案子。这就是我询问有关method POD提取器模块的原因

我想在REPL或debuger中显示输出,因此浏览器中指向锚定html pod的任何指针对我来说都不方便

这可能是因为有更简单的东西,我被弄糊涂了

我的第一个暴力和昂贵的方法:

> $self = new MyModule
> m $self # to see the available methods for double check the spelling
> # method wanted '_connect_db'
> $cmd = 'perldoc -t ' . ref($self)
> x qx{$cmd}=~/(_connect_db.*?)\n\n/msg
更新2


另一个获取信息的地方是。这个脚本生成用于浏览API的html,我在和中使用它。我相信通过阅读源代码,我会学到一些东西。

我还可以找到任何一个CPAN模块,它确实符合您的要求

我想知道你是否能把它们结合起来

Pod::Coverage允许您获得以下符号:

snoopy@deb6:~$ perl -de0
DB<1> use Pod::Coverage
DB<2> our $pc = Pod::Coverage->new(package => 'Mouse');
DB<3> $pc->coverage;
DB<4> use Data::Dumper
DB<5> p Dumper $pc->{symbols}
$VAR1 = {
  'around' => 1,
  'init_meta' => 0,
  'super' => 0,
  'has' => 1,
  'after' => 1,
  'augment' => 0,
  'inner' => 0,
  'override' => 0,
  'with' => 0,
  'extends' => 1,
  'before' => 1
};
snoopy@deb6:~$perl-de0
数据库使用Pod::覆盖率
DB我们的$pc=Pod::Coverage->new(包=>'Mouse');
DB$pc->覆盖范围;
数据库使用数据::转储程序
DB p转储程序$pc->{symbols}
$VAR1={
“大约”=>1,
'init_meta'=>0,
“超级”=>0,
'has'=>1,
'在'=>1之后,
“增大”=>0,
“内部”=>0,
“覆盖”=>0,
'与'=>0,
“扩展”=>1,
'之前'=>1
};
也许Pod::Select(或类似)可以用来提取相关部分


编辑或者子类/modify Pod::Coverage来收集正文文本和符号。

的交互式shell()允许您使用
命令,也许可以为REPL做类似的事情。

是的,打开另一个窗口并使用它运行
perldoc
,这太容易了;-),这就是我一直在做的。我使用ssh连接+gnu屏幕,为perldocs创建一个新的shell,但是您需要搜索方法(复制粘贴或自己编写),这有点分散注意力。另一方面,这里的代码是概念的证明。为了实际使用,我将把这些行包装在一个方法中,并传递
($module,$method)
。也许可以试试KomodoEdit。我相信,当您开始编写对sub的调用时,它将向您显示文档。问题是,我只使用文本环境(shell、vi、emacs-nw以及交互式perl的调试程序或pdl2),因此komodo、eclipse、perlpod web环境不是一个理想的选择。5年前,当我需要在笔记本电脑中使用windows时,我非常喜欢Komodo,但从那时起我就没有使用任何IDE。现在只在emacs-nw中编写Perl(c-Perl模块也可以从源代码中查看POD)。谢谢Joel,我正在寻找类似的东西,所以要求模块的原因是为了看看人们“发明”了什么,可以通过某种方式构造/标记POD,以便您以后提取特定信息。我喜欢R方法来编写文档(并在R文档中谈论好的东西:swave),我已经看过了源代码,包Pod::Coverage::Extractor(编码在Pod::Coverage文件中)有一个方法命令,我可以使用它来提取数据。我正在创建一个答案来记录它,但我会接受你的答案,给你一个良好的提示我的认可direction@Pablo(后来很晚才想到)我最近遇到了Devel::Command,它很好地扩展了Perl调试器REPL,让您可以添加新命令。
# package Pod::Coverage::Extractor
#extract subnames from a pod stream
sub command {
    my $self = shift;
    my ( $command, $text, $line_num ) = @_;
    if ( $command eq 'item' || $command =~ /^head(?:2|3|4)/ ) {

        # take a closer look
        my @pods = ( $text =~ /\s*([^\s\|,\/]+)/g );
        $self->{recent} = [];

        foreach my $pod (@pods) {
            print "Considering: '$pod'\n" if debug;

            # it's dressed up like a method cal
            $pod =~ /-E<\s*gt\s*>(.*)/ and $pod = $1;
            $pod =~ /->(.*)/           and $pod = $1;

            # it's used as a (bare) fully qualified name
            $pod =~ /\w+(?:::\w+)*::(\w+)/ and $pod = $1;

            # it's wrapped in a pod style B<>
            $pod =~ s/[A-Z]<//g;
            $pod =~ s/>//g;

            # has arguments, or a semicolon
            $pod =~ /(\w+)\s*[;\(]/ and $pod = $1;

            print "Adding: '$pod'\n" if debug;
            push @{ $self->{ $self->{nonwhitespace}
                    ? "recent"
                    : "identifiers" } }, $pod;
        }
    }
snoopy@deb6:~$ perl -de0
DB<1> use Pod::Coverage
DB<2> our $pc = Pod::Coverage->new(package => 'Mouse');
DB<3> $pc->coverage;
DB<4> use Data::Dumper
DB<5> p Dumper $pc->{symbols}
$VAR1 = {
  'around' => 1,
  'init_meta' => 0,
  'super' => 0,
  'has' => 1,
  'after' => 1,
  'augment' => 0,
  'inner' => 0,
  'override' => 0,
  'with' => 0,
  'extends' => 1,
  'before' => 1
};