> -----Original Message----- > From: Robert Thompson [mailto:[EMAIL PROTECTED]] > Sent: Tuesday, June 04, 2002 3:38 PM > To: [EMAIL PROTECTED] > Subject: Passing array to subroutine problem > > > Hello, > > I have a subroutine where I want to pass some > paramaters to it, but assign default ones if a paramater is > not passed. This is similar to CGI. > > &mySub( -param1=>'my value', -param3=>'value' ); # > -param2 would get a default value > > > The problem I am running into is if one of the > paramaters passed is an array, and the value passed is 0, the > default value gets assigned instead of the 0 that was passed. > Below is some code that shows what I am doing and how it breaks: > > #!/usr/bin/perl -Tw > > use strict; > > &Baz( one=>'all good', two=>['zero','one'] ); # text works > &Baz( one=>'bad', two=>[0,1] ); # numbers fail > &Baz( one=>'more bad', two=>['0','1'] ); # quoted numbers fail > > > sub Baz { > my %params = @_; > > $params{one} = "default" unless $params{one}; > $params{two}[0] = "default" unless $params{two}[0];
Comment this one out. > $params{two}[1] = "default" unless $params{two}[1]; > > # let's try some more, they still fail... > $params{two}[0] = "default" unless defined($params{two}[0]); This one works, but you need to comment out the one 3 lines up. > $params{two}[0] = "default" unless $params{two}[0] || > $params{two}[0] == 0; > > print "one is $params{one}\n"; > print "two[0] is $params{two}[0]\n"; > print "two[1] is $params{two}[1]\n"; > print "\n"; > > return(1); > } > __END__ If you want to have default values for arguments, you can use the following trick: sub foo { my %args = (arg1 => 'default1', arg2 => 'default2', @_); ... } The trick is to put your defaults first in the list, followed by @_. If the same key appears more than once in a list assignment to a hash, only the last value is used. Now if you call foo(arg1 => 'bar'), the 'bar' will override 'default1'. If you just call foo(), $args{arg1} will be 'default1'. Make sense? -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]