Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re^3: Print HTML form to file using CGI.pm save method

by Anonymous Monk
on Aug 03, 2012 at 23:10 UTC ( #985364=note: print w/ replies, xml ) Need Help??


in reply to Re^2: Print HTML form to file using CGI.pm save method
in thread Print HTML form to file using CGI.pm save method

Aren't variables defined within subroutine valid only for that subroutine?

Sure (lexicals are), unless you return them


Comment on Re^3: Print HTML form to file using CGI.pm save method
Re^4: Print HTML form to file using CGI.pm save method
by SerZKO (Beadle) on Aug 04, 2012 at 10:05 UTC

    But isn't it so that when you return a variable from a subroutine you return it to main scope only ? I've tried to call it from another subroutine and got error message (global symbol $Extnr needs explicit package name). So it seems that I either need to declare those in main scope or to use an intermediate variable to transfer the value of $Extnr through different scopes. Or... ?

      sub kundNytt { my ($trans) = @_; # do something with $trans my $somevar = 88; return $somevar; } my $result; $result = kundNytt(42); print $result; # prints '88'

      But isn't it so that when you return a variable from a subroutine you return it to main scope only ?

      No, you return it to the caller

      Consider

      sub sparaData { open (KOF, ">$konfil") or die "Kan inte \xF6ppna filen $konfil"; flock (KOF, 2) or die "Kan inte l\xE5sa filen $konfil"; $qry-> save (*KOF) or die "Kan inte spara filen $konfil"; close KOF; $size = -s $konfil; return; }

      Its better written as

      sub sparaData { my( $konfil, $qry ) = @_; open my($KOF), ">$konfil" or die "Kan inte \xF6ppna filen $konfil +"; flock $KOF, 2 or die "Kan inte l\xE5sa filen $konfil"; $qry-> save ( $KOF) or die "Kan inte spara filen $konfil"; close $KOF; my $size = -s $konfil; return $size; }

      And use it as

      my $qry = CGI->new; my $number = sparaData( "blah/blah/blah.data", $qry );
      $qry and $qry are not the same variable, $size and $number are not the same variable -- they each respectively have the same value, but they live in different scopes

      If you changed it to

      my $roshambo = CGI->new; my $size = sparaData( "blah/blah/blah.data", $roshambo );
      the new code would still work because you don't depend on global vars

      See Tutorials: Variable Scoping in Perl: the basics, Coping with Scoping , Mini-Tutorial: Perl's Memory Management, Lexical scoping like a fox

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://985364]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (7)
As of 2014-08-29 05:43 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (275 votes), past polls