On Friday 02 April 2004 07:04 am, Beau E. Cox wrote: > On Friday 02 April 2004 06:37 am, JupiterHost.Net wrote: > > Hello List, > > > > It just occurred to me that many Perl functions use $_ if not other > > value is supplied. chomp for instance..., which is very handy... > > > > If one wanted to write a function that used either the given argument or > > $_ how would you do that? > > > > myfunc($myvalue); > > or > > myfunc; #uses the current value of $_ > > > > sub myfunc { > > > > my $func_arg = shift || ????; # you wouldn't just do '|| $_;' would > > you? > > > > ... > > Hi - > > I think what you are trying to do is modify a passed argument - like chomp > does - which really has nothing to do with $_. Normaly a subroutine gets > its arguments from the @_ array and puts them in a private variable, > does its thing, and returns a value. This is commonly called 'pass by > reference' and is a nice, safe way to do things. If you want to operate > on the passed arguments themselves ('pass by value') - which can be more > error prone (at least in some cases), you can do that - as chomp does. > > In the sample below, 'to_lower' modifies the incoming argument, and > 'to_upper' does not. > > #!/bin/perl > > use strict; > use warnings; > > my $string = 'hello'; > print "before to_upper: $string\n"; > to_upper( $string ); > print " after to_upper: $string\n"; > to_lower( $string ); > print " after to_lower: $string\n"; > > sub to_upper > { > # actually modified the incoming argument the - > # 0th element of @_. > $_[0] = uc $_[0]; > } > > sub to_lower > { > # traditional approach > my $string = shift; > lc $string; > return $string; > } > > When run, it returns: > > before to_upper: hello > after to_upper: HELLO > after to_lower: HELLO >
That's all well and good, but after re-reading you query, here is what you really want: #!/bin/perl use strict; use warnings; my $string = 'hello'; print "before to_upper w/arg: $string\n"; to_upper( $string ); print " after to_upper w/arg: $string\n"; $_ = 'hiya'; print "before to_upper no/arg: $_\n"; &to_upper; print " after to_upper no/arg: $_\n"; sub to_upper { # point to passed arg or caller's $_ my $arg = $_[0] ? \$_[0] : \$_; # modify in place $$arg = uc $$arg; } Aloha => Beau; -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>