This is a massive hack, but it sort of works. Comes with no warranty.
Assuming you have two files with Perl in them, attempts to find subroutines in the first which are used in the second. I'm almost embarrassed to post this as it's so crufty and somewhat dependent on coding style (not using PPI, for example), but this solves most of the problem it was meant to solve.
My next bit should be to write a Vim function which figures out what file I am "require"ing or "use"ing on the cursor's current line and automatically make that the "from" file and the file I'm editing the "to" file.
#!/usr/bin/perl
use strict;
use warnings;
use Regexp::Assemble;
use Text::Table;
my $min_sub_name_length = 4;
my $from = shift or die "usage: $0 from_perl to_perl";
my $to = shift or die "usage: $0 from_perl to_perl";
open my $fh, '<', $from or die "Cannot open ($from) for reading: $!";
my @subs;
while (<$fh>) {
push @subs => $1
if /^\s*sub\s+([[:word:]]+)/ && length $1 >= $min_sub_name_length;
}
close $fh or die $!;
my $ra = Regexp::Assemble->new;
$ra->add($_) foreach @subs;
my $possible_sub = $ra->re;
open $fh, '<', $to or die "Cannot open ($to) for reading: $!";
while (<$fh>) {
chomp;
if (/\b$possible_sub\b/) {
print_subs(@subs);
print "Line $.: $_\n";
}
}
{
my $table_printed = 0;
sub print_subs {
return if $table_printed++;
my @subs = sort @_;
print " -- Possible subs we're looking for --\n\n";
my $tb = Text::Table->new;
$tb->load( [ splice @subs, 0, 3 ] ) while @subs;
print $tb;
print "\n";
}
}
And I get output similar to:
:!find_subs_in_other_file lib/General/Config.pm cronjobs/searchlog
-- Possible subs we're looking for --
append_newline_if_not_exists back check_domain_syntax
chown_by_name config domain_tld_lookup
generate_row generate_side_table generate_table
get_brand_from_username get_config get_dedicated_transfer
get_os get_prior_bandwidth get_server_fqdn
hashed_directory html_email htmlify
plain_email process_template_files round
validate_ip
Line 32: %config = get_config("/usr/local/controlpanel/conf/cron.conf");
Line 34: $dbh = DBI->connect("DBI:$config{sql_server}:$config{sql_database}:$config{sql_host}","$config{sql_username}","$config{sql_password}", { AutoCommit => 1 }) || notify("Could not connect to a database server");
Line 137: my $admin_email = config('admin_email');
Line 236: =back
Not perfect, but it's a helpful start.