Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Passing Sub Values

by Anonymous Monk
on Mar 21, 2008 at 15:57 UTC ( [id://675449] : perlquestion . print w/replies, xml ) Need Help??

Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks!

I am trying to pass some values from one sub to another to do some further validations, can't figured it out why it doesn't work, it is a simple plan, here is a prototype of what I am trying to do, any help would be great!!!

#!/perl/bin/perl -w use CGI qw(:standard); use CGI::Carp qw(fatalsToBrowser); use strict; print header(); my $tran = param("tran"); my $val_1 = "My Name"; my $val_2 = "Zip Code"; if($tran eq ""){ &first }elsif( $tran eq "edit"){ &second;}else{ &first; } sub first { print "I've got::: Val 1=$val_1 and Val 2=$val_2<br>"; my $val_3 = "Tested"; my $val_4 = "Passed"; print "<br>And I have::: Val 3=$val_3 and Val 4=$val_4<br>"; print "<br><a href=\"pass.pl?tran=edit\">Edit X</a>"; return ($val_1,$val_2,$val_3,$val_4); } sub second { my $got_val_1 = $_[0]; my $got_val_2 = $_[1]; my $got_val_3 = $_[2]; my $got_val_4 = $_[3]; print "Got these from values from the sub first::: *$got_val_1* and *$ +got_val_2* and *$got_val_3* and *$got_val_4* - Done!!!<br>"; print "<a href=\"pass.pl?tran=\">back</a>"; }

Replies are listed 'Best First'.
Re: Passing Sub Values
by lidden (Curate) on Mar 21, 2008 at 16:51 UTC
    I don't really know what it is you want, but perhaps something like this:
    use CGI qw(:standard); use CGI::Carp qw(fatalsToBrowser); use strict; print header(); my $tran = 'edit'; #param("tran"); my $val_1 = "My Name"; my $val_2 = "Zip Code"; if($tran eq 'edit'){ second(first($val_1, $val_2)); } else{ first(); } sub first { my $arg_1 = shift; my $arg_2 = shift; print "I've got::: Val 1=$arg_1 and Val 2=$arg_2<br>\n"; my $val_3 = "Tested"; my $val_4 = "Passed"; print "<br>And I have::: Val 3=$val_3 and Val 4=$val_4<br>\n"; print "<br><a href=\"pass.pl?tran=edit\">Edit X</a>\n"; return ($arg_1,$arg_2,$val_3,$val_4); } sub second { my $got_val_1 = $_[0]; my $got_val_2 = $_[1]; my $got_val_3 = $_[2]; my $got_val_4 = $_[3]; print "Got these from values from the sub first::: *$got_val_1* an +d *$got_val_2* and *$got_val_3* and *$got_val_4* - Done!!!<br>\n"; print "<a href=\"pass.pl?tran=\">back</a>\n"; }
      Almost, the values on the second sub should only show up after you click on the "Edit X" link on the sub first.
        Changing this,
        #my $tran = 'edit'; #param("tran"); my $tran = param("tran");

        works!
      There is a problem, when you run this it is also bringing the rest of the stuff from the first sub, the ideal thing would be to just print the values been passed from sub first like:  return ($arg_1,$arg_2,$val_3,$val_4); and what ever else is in the sub second.
        You seem confused about what is returned from a function and the stuff that is printed to the screen/browser. That said, if I understand you correctly you want something like the following, leave the second() function as above.
        if($tran eq 'edit'){ second(common($val_1, $val_2)); } else{ first(common($val_1, $val_2)); } sub common{ my $arg_1 = shift; my $arg_2 = shift; my $val_1 = "Tested"; my $val_2 = "Passed"; return ($arg_1,$arg_2,$val_1,$val_1); } sub first { my ($arg_1, $arg_2, $val_3, $val_4) = @_; print "I've got::: Val 1=$arg_1 and Val 2=$arg_2<br>\n"; print "<br>And I have::: Val 3=$val_3 and Val 4=$val_4<br>\n"; print "<br><a href=\"pass.pl?tran=edit\">Edit X</a>\n"; }
Re: Passing Sub Values
by swampyankee (Parson) on Mar 21, 2008 at 16:03 UTC

    Usually, one uses the argument list to pass information into a subroutine. Also, it would seem that you're throwing out the return values from each of your two subs.

    Also, I (at least) find your code formatting to be, ahem, confusing, but that's an aesthetic, not technical, judgment.


    emc

    Information about American English usage here and here. Floating point issues? Please read this before posting.

      Well, can you show how you would solve this?

        lidden already did that. My suggestion would be similar in concept if not in details, so it would be redundant.

        For code formatting, I'm lazy and use the cperl mode in emacs. My advice is if you don't have emacs, get either GNU emacs, here or its near-sibling, Xemacs, here.


        emc

        Information about American English usage here and here. Floating point issues? Please read this before posting.