use strict; my $filename = $ARGV[0]; my $current_line = $ARGV[1]; my (%subs,$linecnt, %types, %indents); open (IN,$ARGV[0]); my $previous_sub; my $previous_sub_line = 0; my $current_sub_name; while () { my $line = $_; chop($line); $linecnt ++; if ($line =~ /([\s|\t]*)(sub|def|class)[\s]+(\w+)/) { $subs{$3} = $linecnt; $types{$3} = $2; $indents{$3} = $1 if ($2 ne 'sub'); if ($current_line >= $previous_sub_line && $current_line < $linecnt && ! $current_sub_name) { $current_sub_name = $previous_sub; } $previous_sub_line = $linecnt; $previous_sub = $3; } } close IN; $current_sub_name = $previous_sub if (!$current_sub_name && $previous_sub); if ($current_sub_name) { print "\n>> CURRENTLY IN:\n"; print ">> $indents{$current_sub_name}$types{$current_sub_name} [$current_sub_name] at $filename line $subs{$current_sub_name}\n"; } else { print "\n>> \n"; print ">> *** Not in a function / class block ***\n"; } print "\n"; print "FUNCTION LIST:\n"; foreach my $sub (sort {$a cmp $b} keys %subs) { print "$indents{$sub}$types{$sub} [$sub] at $filename line $subs{$sub}\n"; }