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

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

by SerZKO (Beadle)
on Aug 03, 2012 at 20:17 UTC ( #985341=note: print w/ replies, xml ) Need Help??


in reply to Re: 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?


Comment on Re^2: Print HTML form to file using CGI.pm save method
Re^3: Print HTML form to file using CGI.pm save method
by Anonymous Monk on Aug 03, 2012 at 23:10 UTC

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

    Sure (lexicals are), unless you return them

      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

Re^3: Print HTML form to file using CGI.pm save method
by Anonymous Monk on Aug 04, 2012 at 10:20 UTC

    One thing some beginning programmers (usually of the procedural discipline) often miss is that functions are supposed to be like their mathematical definition, f(x) = expr. That is, they generally take a value or three as input, and return a value as output. They aren't supposed to access variables outside their scope ("globals", as we call them in the programming world). Of course, there are half a dozen of exceptions to that rule.

    I can see that you are accessing the variables $clrNr, $tempfil, and $qry. I'll trust that the latter two are OK as globals, but the first one probably isn't. Here's how we pass it to your function:

    sub kundNytt { my ($trans) = @_; # do something with $trans }

    And here is how you call it.

    $clrNr = 42; kundNytt($clrNr);

    Your code, as it is currently, is fragile, and relies on $clrNr being correctly set before the function is called. It will break sooner or later. Seeing that functions are akin to their mathematical definition helps produce code that is much easier to understand and more reliable.

    Ah, this is probably covered in pretty much every programming book written in the last three decades. You could read one :)

      Hej all of you Anonimous Monks (couse I'm not sure if you are the same one posting all of the replies)

      First of all, thank you for your time. I now understand use of return much better and will for sure benefit from that in the future. I see already where I need to modify my code. But I probably wouldn't get it if you didn't mention mathematical definition.

      And as for reading, believe me I've read a (and still reading) Llama book, Camel book, CGI programming with perl, Intermediate Perl, Perl best practices, Perl cookbook. But when you're close to 50 it's not that easy to learn a new language (especially if it's not from your language group). That is as easy as learning Serbian if you are German or learning Swedish if you're Spanish, or learning Franch if you are Chinese. But I'm giving my best with "learning-by-doing" :-)

      Thanks again

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (10)
As of 2014-12-19 03:56 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (70 votes), past polls