I wrote up a little example script using the new
Module::Info->subroutines_called.  Anyone that's ever tried to use
grep to find a function call in a perl program will appreciate this.
The following finds all function/method calls to isa().

$ pfunc isa /usr/share/perl/5.6.1/*.pm
Called as function in /usr/share/perl/5.6.1/CGI.pm at line 316
Called as function in /usr/share/perl/5.6.1/CGI.pm at line 327
Called as function in /usr/share/perl/5.6.1/CGI.pm at line 397
Called as function in /usr/share/perl/5.6.1/CGI.pm at line 494
Called as function in /usr/share/perl/5.6.1/CGI.pm at line 495
Called as object method in /usr/share/perl/5.6.1/CPAN.pm at line 4957
Called as function in /usr/share/perl/5.6.1/Dumpvalue.pm at line 191
Called as function in /usr/share/perl/5.6.1/Dumpvalue.pm at line 218
Called as function in /usr/share/perl/5.6.1/Dumpvalue.pm at line 248
Called as function in /usr/share/perl/5.6.1/Dumpvalue.pm at line 251
Called as function in /usr/share/perl/5.6.1/Dumpvalue.pm at line 254
Called as object method in /usr/share/perl/5.6.1/Shell.pm at line 28
Called as object method in /usr/share/perl/5.6.1/base.pm at line 12

pfunc will be distributed with Module::Info from now on.

PS The above won't work quite right with 0.11 due to a fistful of bugs
I just fixed.


#!/usr/bin/perl -w

$| = 1;

use Module::Info;

my $func = shift;
foreach my $file (@ARGV) {
    my $mod = Module::Info->new_from_file($file);
    unless( $mod ) {
        warn "Can't find $file\n";
        next;
    }
    my @calls = sort { $a->{line} <=> $b->{line} }
                grep { defined $_->{name} and $_->{name} eq $func }
                     $mod->subroutines_called;
    foreach my $call (@calls) {
        print "Called as $call->{type} in $file at line $call->{line}\n";
    }
}


-- 

Michael G. Schwern   <[EMAIL PROTECTED]>    http://www.pobox.com/~schwern/
Perl Quality Assurance      <[EMAIL PROTECTED]>         Kwalitee Is Job One
I knew right away that my pants and your inner child could be best friends.

Reply via email to