Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Re: subroutine bewilderment: how to mimic builtins

by ikegami (Patriarch)
on Feb 07, 2006 at 23:22 UTC ( [id://528666]=note: print w/replies, xml ) Need Help??


in reply to subroutine bewilderment: how to mimic builtins

To work on $_ by default, check the size of @_. For example,
sub func { local $_ =   @_ ? $_[0] : $_;  ... } # copy
sub func { local *_ = \(@_ ? $_[0] : $_); ... } # alias

To request a scalar argument, use prototypes. For example,
sub func($)  { ... } # scalar
sub func(;$) { ... } # optional scalar
This is required for $str = my_uc my_reverse 'ab', 'cd'; to work.

Finally, use wantarray to determine whether a list or a scalar (or nothing at all) should be returned.

In Perl, your functions would be the following:

sub pp_lcfirst(;$) { local $_ = @_ ? $_[0] : $_; s/(.)/\l$1/; return $_; } sub pp_uc(;$) { local $_ = @_ ? $_[0] : $_; s/(.*)/\U$1/; return $_; } sub pp_reverse { if (wantarray) { my @rv; push(@rv, pop(@_)) while @_; return @rv; } else { my $str = join('', @_); my $rv = ''; my $i = length($str); $rv .= substr($str, $i, 1) while $i--; return $rv; } } sub spaces_to_und(;$) { local $_ = @_ ? $_[0] : $_; s/\s+/_/g; return $_; }

Update: Cleanup.

Update: Fixed the typo japhy noticed in my prototypes.

Replies are listed 'Best First'.
Re^2: subroutine bewilderment: how to mimic builtins
by japhy (Canon) on Feb 07, 2006 at 23:59 UTC
    Shouldn't those $; prototypes be ;$ like spaces_to_und()'s?

    Jeff japhy Pinyan, P.L., P.M., P.O.D, X.S.: Perl, regex, and perl hacker
    How can we ever be the sold short or the cheated, we who for every service have long ago been overpaid? ~~ Meister Eckhart
Re^2: subroutine bewilderment: how to mimic builtins
by ysth (Canon) on Feb 08, 2006 at 02:43 UTC
    Note that ;$ doesn't parse the same as a builtin like uc:
    $ perl -we'print uc 1, 2' 12 $ perl -we'sub myuc(;$) { $_[0]||$_ } print myuc 1, 2' Too many arguments for main::myuc at -e line 1, at EOF
    Also, in the presence of my $_, myuc won't be able to see the right $_. Implementing a _ prototype is on the todo list, but not on any particular person's plate that I know of.

      I know, but it's as close as possible. Considering the case that is different is an illegal case, I didn't bother confusing the issue by mentioning it.

      my $_; doesn't compile for me with Perl v5.8.6. Did you mean tie $_? There's some kind of problem with local $_ when $_ is tied, but 1) that's not likely, and 2) it can be avoided by localizing *_ instead of $_ (as I did in one of my examples).

        my $_; is intended as a replacement for the not-ideal local $_; or local *_;.

        perl591delta:

        =head2 Lexical $_

        The default variable $_ can now be lexicalized, by declaring it like any other lexical variable, with a simple

        my $_;
        The operations that default on $_ will use the lexically-scoped version of $_ when it exists, instead of the global $_.

        In a map or a grep block, if $_ was previously my'ed, then the $_ inside the block is lexical as well (and scoped to the block).

        In a scope where $_ has been lexicalized, you can still have access to the global version of $_ by using $::_, or, more simply, by overriding the lexical declaration with our $_.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://528666]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others learning in the Monastery: (3)
As of 2024-04-24 20:18 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found