in reply to Need Unused Variable Warning Msgs

Something like this might work:

#!/usr/bin/perl -w use strict; my %seen; while (<>) { s![\$\%\@]([a-zA-Z]\w*)!$seen{$1}++!eg } my @once = sort grep { $seen{$_} == 1 } keys %seen; if (@once) { print "Possible unused variables found: \n\n", join("\n", @once), +"\n"; }

Now, that's hardly foolproof. In any reasonably complicated program it's likely to show a lot of false positives. It might also miss some cases where a variable name is used in more than one type - $foo and @foo for example. A more complicated regex could be devised to deal with that case. Worse, if a variable is declared in multiple scopes but never used then it won't be in the list.

But for your test case it works! If I put my code in use.pl and yours in foo.pl:

$ perl use.pl foo.pl Possible unused variables found: var_a

-sam

Replies are listed 'Best First'.
Re: Need Unused Variable Warning Msgs
by Abigail-II (Bishop) on Jun 10, 2002 at 17:10 UTC
    It would fail on a simple piece of code like this:
    {my $var;} {my $var;}
    Both variables are unused. "Unused" would mean only declared in a certain scope, not only declared in the entire program.

    Abigail

      Writing a regex that parses Perl scopes is left as an exercise for the reader. Ultimately that's what tools like lint have done for C - they actually parse the C code just like a compiler would and do pattern matching to find bad code.

      -sam

        Parsing C is orders of magnitude simpler than Perl. Not even perl can always pass Perl.

        But even if you have such a regex, to actually find out whether a variable is unused or not, you've got to know what a piece of code will do. To determine that at compile time, you need to solve the halting problem.

        If you solve the halting problem, I'll do the regex.

        Abigail