Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re: How to find barewords in perl code?

by JavaFan (Canon)
on Jun 01, 2010 at 16:02 UTC ( #842643=note: print w/replies, xml ) Need Help??


in reply to How to find barewords in perl code?

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).

Replies are listed 'Best First'.
Re^2: How to find barewords in perl code?
by moritz (Cardinal) on Jun 01, 2010 at 16:12 UTC
    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.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://842643]
help
Chatterbox?
[Corion]: hippo: If you have a Unicode-wise Perl then likely some zero-width characters in $x would work. Maybe $x = "\x{200b}" works.
[Corion]: Hmm - no, that outputs 1 for me on 5.14 - perl -wle "my $x = qq(\x{200b}); warn $x; warn length $x"
[hippo]: Smart - I'll give that a go. Thanks.
[hippo]: Ah
[Corion]: But maybe there is some other Unicode string that will be true but have a zero width
[hippo]: For explanation, I've seen this construct in someone else's code (no names, no pack drill) and couldn't think of a situation to trigger it.
[Corion]: You'll have to look somewhere esoteric for that. Maybe some tied variable or special dualvar can also trigger that. But it's certainly not a common occurrence
[Corion]: And on 5.20, the following also outputs no find:perl -wle 'for my $x ("\x{2000}".."\ x{1fffff}") { if( $x && ! length $x ) { warn qq(<$x>); warn length $x; die } }'
[Corion]: (this time on Unix)

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (9)
As of 2017-07-27 13:28 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    I came, I saw, I ...
























    Results (413 votes). Check out past polls.