http://www.perlmonks.org?node_id=842630

mithaldu has asked for the wisdom of the Perl Monks concerning the following question:

I am currently rewriting a rather large code-base that makes extensive and terrifying use of bareword filehandles. In order to clean it up i intend to replace them all with proper FileHandle objects. However quite a few of them have very imaginative names like "G".

So, in order to make this task a bit more sane to complete: Is there some kind of module i can run the code through which parses it and can tell me where barewords are?

Replies are listed 'Best First'.
Re: How to find barewords in perl code?
by moritz (Cardinal) on Jun 01, 2010 at 14:58 UTC
    I'm pretty sure that Perl::Critic can be used to detect bareword filehandles, it probably even has a pre-defined rule for that.
      It does! Thanks a lot.
Re: How to find barewords in perl code?
by JavaFan (Canon) on Jun 01, 2010 at 16:02 UTC
    And if it wasn't for perlcritic, I'd think that /(?:open(?:dir)?|print|close|flock|readdir)\s+[A-Za-z] would find most of them, with little false positives. (Of course, one can easily construct false positives and false negatives).
      I'd add a (?![,(]) to the end of that regex to exclude print functioncall() and print functionall, otherstuff.

      Now let the bikeshedding and micro-optimizations begin!

        Hmmm, forgot about function calls like that. For some reason, I assumed perl would warn. But even this is warning free:
        sub foo {shift} sub bar {1} print foo bar;
        and just prints 1.

        OTOH, in pre-5.6 days, when I was still using bare word file handles, I used all uppercase names, and I use all lowercase for subs, so /(?:print|...)\s+[A-Z]/ would have worked for my code.