请考虑以下Perl脚本 script.pl 作为示例:
use strict;
use warnings;
sub f1
{statements}
sub f2
{statements}
sub f3
{statements}
f1();f2();f3();
当我执行脚本时,它应该显示如下输出:
./ script.pl
子程序数量:3
子程序的名称:f1 f2 f3
答案 0 :(得分:8)
您正在寻找Devel::Symdump:
#!/usr/bin/env perl
use strict;
use warnings;
{
require Devel::Symdump;
my $sym = Devel::Symdump->new('main');
my @subs = $sym->functions;
printf "Number of subroutines: %d\n", scalar @subs;
printf "Names of subroutines: %s\n", join(q{, } => map { s/^main:://; $_ } @subs);
}
sub f1 {
# statements
}
sub f2 {
# statements
}
sub f3 {
# statements
}
f1();
f2();
f3();
输出:
Number of subroutines: 3 Names of subroutines: f2, f1, f3
答案 1 :(得分:6)
Devel::Examine::Subs可以做这些事情。
use strict;
use warnings;
use feature 'say';
use Devel::Examine::Subs;
my $des = Devel::Examine::Subs->new(file => $0);
my $subs = $des->objects;
say "number of subs:" . @$subs . "\n";
for my $sub (@$subs){
say "name: " . $sub->name; # name of sub
say "start: " . $sub->start; # first line number of sub in file
say "end: " . $sub->end; # last line number of sub in file
say "lines: " . $sub->line_count; # number of lines in sub
# $sub->code; # entire sub code from file
# $sub->lines; # lines that match search term
say "\n";
}
sub func1 {}
sub func2 {}
sub func3 {}
输出:
number of subs:3
name: func3
start: 25
end: 25
lines: 1
name: func2
start: 24
end: 24
lines: 1
name: func1
start: 23
end: 23
lines: 1
答案 2 :(得分:2)
我认为您正在寻找的功能是caller
:
#!/usr/bin/env perl
use strict;
use warnings;
sub test {
my (
$package, $filename, $line, $subroutine,
$hasargs, $wantarray, $evaltext, $is_require,
$hints, $bitmask, $hinthash
)
= caller(0);
print "$subroutine called at $line of $filename\n";
}
test;
注意 - 没有参数,caller
只返回包,文件名和行。如果您正在嵌套子例程,则该数字是多个堆栈帧。