Dan Muey wrote:
> I have this subroutine and it does what I need ::
>
> print rmgtlt($var);
>
> sub rmgtlt {
>
> $_[0] =~ s/^\<|\>$|\n|\r|\s$//g;
> return $_[0];
> }
>
> Is there a way to so the substitution and return the result in one
> line?
>
> Like ::
>
> sub rmgtlt {
> return ??? $_[0] =~ s/^\<|\>$|\n|\r|\s$//g;
> }
>
> I tried using parenthesis and using list context ::
> return my($q) = $_[0] =~ s/(^\<|\>$|\n|\r|\s$)//g; }
>
> And you might have figured it returned the number of elements matched
> and not the newly fixed up variable contentes.
>
> Is there a way to do this?
> I know I must be missing something obvious , thanks for any guidance!

Hi Dan.

How about:

    sub rmgtlt { $_[0] =~ s/^\<|\>$|\n|\r|\s$//g; return $_[0]; }

;-D

Seriously though, there's no way to do it apart from something like
that since, as you've discovered, the substitute operator returns
the number of substitutions it has performed - the modified string
isn't available without using it explicitly. You can make it a little
smaller though: the regex could be slightly shorter and the 'return'
is unnecessary on the last line of the routine.

    sub rmgtlt { $_[0] =~ s/^<|[\n\r]|[>\s]$//g; $_[0] }

Did you realise though, that since the substitution is changing
the element of the @_ array, the actual parameter in the call
will be modified, so that

    my $email = '<[EMAIL PROTECTED]>';
    rmgtlt ($email);

will edit $email for you? There's no need to do

    $email = rmgtlt ($email);

as you may be thinking. Also, the parameter must be an
lvalue. If you call the routine with a constant string as its
parameter it will fail because the substitution cannot be
done on a constant.

HTH,

Rob




-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to