gpt4 book ai didi

perl - 您如何从 REPL 或调试器中检索方法的 POD?

转载 作者:行者123 更新时间:2023-12-02 02:28:44 25 4
gpt4 key购买 nike

在 REPL 或调试器中使用方法/函数时,我希望能够看到它的文档。

是否有任何模块可以让您在使用 REPL 或调试器时查看函数的文档?。

显然,如果该模块存在,它会要求您提供具有可解析结构的 POD 和代码,以便提取文档。这不是问题,因为我已经记录了我所有的代码并且我可以适应任何需要的东西。目前,我的所有方法都带有一个带有 =head2 method_name 的前面的 POD 以及名称、用法、示例、args、返回、异常(exception)等的典型行

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

我想要像 get_pod($moudle_bar, $method_foo) 这样的东西,或者更好的是能够将 get_pod 放在基本模块中并能够说 $bar->get_pod('foo') 。我知道这不是微不足道的,并且有很多极端情况。这就是我询问方法 POD 提取器模块的原因。

我想在 REPL 或调试器中显示输出,因此在浏览器中指向锚定 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
0  '_connect_db     Title   : _connect_db     Usage   :     Function: create a database conection and return the handler     Example : $dbh = $self->_connect_db($user, $pass, $db_name) # host is FPrefect by default     Returns : [0] DBI $dbh object     Args    :                [0] $user,                [1] $pass,                [2] $db_name,                [3] $host,                [4] $db_brand # mysql, sqlite                [5] $mode = (ro, rw) # not used now. in the future it would use this for read the user and password'

Obviously this works because I know that I don't have any empty lines in my method description PODs so I use .*?)\n\n in the regex to capture the rest of the method POD.

Do someone have any good suggestion or advice for this task?

UPDATE:

Following snoopy suggestions I have taken a look at Pod::Coverage source code and I found that Pod::Coverage::Extractor (a package inside the file for Pod::Coverage) has the method command that look for Pods Item or head elements and extract them. I will take a look how to retrieve this items.

# 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;
}
}

更新 2

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

最佳答案

我还可以找到任何一个 CPAN 模块,它们正是您想要的。

我想知道你是否可以以某种方式组合 Pod::CoveragePod::Select .

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
};

也许 Pod::Select(或类似的)然后可以用来提取相关部分?

编辑 或者子类化/修改 Pod::Coverage 以收集正文和符号。

关于perl - 您如何从 REPL 或调试器中检索方法的 POD?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4730140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com