Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Prototype Killer

by tadman (Prior)
on Sep 03, 2002 at 20:20 UTC ( #194890=snippet: print w/replies, xml ) Need Help??
Description: Simple, rudimetary Perl prototype stripper. For those occasions when the hands-on treatment is far too tedious.

Note that this only strips scalar-only prototypes. If you've got something else in there, it's probably for a reason.

Also null-prototypes (i.e. () ) are not stripped either since that would break your constant subs.
#!/usr/bin/perl -piw

use strict;

s/^\s*(sub\s+\w+)\s*\(\$+\)/$1/g;
Replies are listed 'Best First'.
Re: Prototype Killer
by RMGir (Prior) on Sep 04, 2002 at 11:30 UTC
    But why??

    Whether prototypes are evil or possibly not, do you really want to do this to an existing script?

    Among other possible problems, if you had code like this, you'd break it:

    sub a($) { print @_,"\n"; } my @x=qw(1 2 3); a(@x);
    After your "fix", this would print "123" instead of "3"...
    --
    Mike
      What exactly would be the point of such a subroutine? That's pretty wacky stuff, you have to admit.

      It would be sensible to define any function like this:
      sub a { print $_,$/; } my @x = qw[ 1 2 3 ]; a(scalar(@x));
      Which is similar. I can't think of many examples of where a function would only care about how many elements, and not what they are.

      But anyway, as I said, it is a rudimentary script. YMMV. I found it handy at cleaning house on a whole whack of redundant prototypes in long scripts.
        That was just a simplified example. The point is that if you have a $ proto, arguments are evaluated in scalar context.

        What if someone's invoking a sub with localtime as an argument, for instance?

        I agree, it's possible that's not happening. But without a heck of a good test suite, I'd hesitate to make that kind of change on a project of any size. If there's a wantarray buried in a sub somewhere, it's going to make for a tough problem to debug...
        --
        Mike

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: snippet [id://194890]
help
Chatterbox?
[Eily]: you could tie a variable into not having the same value each time, if you like to make people who try to debug your code facepalm
[Corion]: perl -wle 'package o; use overload q("") => sub {warn "str"; ""}, bool => sub{warn "bool"; 1}; package main; my $o={}; bless $o => o; print "Yay" if ($o && !length($o))'
[Corion]: But people writing such code should document the objects they construct and why it makes sense for an object to be invisible as string while being true in a boolean context
[hippo]: That's equal parts clever and horrendous.
[Eily]: the overload version wouldn't return true with "$x" && !length $x though, I guess
[hippo]: The more I look at this code, the more $x is a plain old scalar and the more this condition will never be true. I'm calling it a bug at this point.
[hippo]: Thanks for your input which has soothed my sanity (a little)
[Corion]: Eily: Sure - if you force both things into stringy things, then you break that magic. But that would also mean that you changed the expression, as now $x = 0.00 will be true instead of false as it were before
[Corion]: Ah no, at least in my feeble experiments that doesn't change the meaning
[Corion]: We sell sanity in small packages ;)

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (9)
As of 2017-07-27 13:40 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    I came, I saw, I ...
























    Results (413 votes). Check out past polls.