如何在执行时在perl脚本中显示子例程及其名称的数量?

时间:2017-06-06 10:07:53

标签: regex linux perl

请考虑以下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

3 个答案:

答案 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只返回包,文件名和行。如果您正在嵌套子例程,则该数字是多个堆栈帧。