On Fri, Apr 12, 2002 at 02:44:38AM -0400, Trey Harris wrote:
> I think I've missed something, even after poring over the archives for
> some hours looking for the answer.  How does one write defaulting
> subroutines a la builtins like print() and chomp()? Assume the code:
> 
>   for <> {
>      printRec;
>   }
>   printRec "Done!";
> 
>   sub printRec {
>      chomp;
>      print ":$_:\n";
>   }
> 
> Assuming the input file "1\n2\n3\n", I want to end up with:
> 
> :1:
> :2:
> :3:
> :Done!:
> 
> I assume I'm missing something in the "sub printRec {" line.  But what?
> (I also assume, perhaps incorrectly, that I won't have to resort to
> anything so crass as checking whether my first parameter is defined...)

The first call to printRec, where you simply want to use the same $_
works without changes. Larry decided that ordinary subs don't
topicalize, partly for this very reason.

But you will be able to tell your subs to topicalize, using a property.
It hasn't been decided yet if this property will be "is topic" or
"is given", probably the latter.

        sub printRec ($msg is given) {
                ...
        }

So for the second call to printRec, you could do something like:

        sub printRec ($msg //= $_ is given) {
                ...
        }

Which would allow you to default to the outer $_ and make the first
argument the topic. It's kind of ugly, though, and wouldn't deal with
subsequent parameters in quite the way you would want. I much prefer
handling the problem with overloading:

        sub printRec {
                chomp;
                print ":$_:\n";
        }

        sub printRec ($msg is given) {
                printRec;
        }

Allison

Reply via email to