timothy adigun <2teezp...@gmail.com> writes:

>>>> use strict;
>>>> use warnings;
>>>>
>>>>
>>>> sub test {
>>>>     print $counter . "\n";
>>>> }
>>>>
>>>>
>>>> my $counter = 0;
>>>> while($counter < 5) {
>>>>     test();
>>>>     $counter++;
>>>> }
>>>>
>>>>
>>>> It says "Global symbol "$counter" requires explicit package name ...".
>>>> When I put the subroutine after the 'while' loop, it works just fine, so
>>>> what's the problem?
>>>
>>> The subroutine does not see the lexical $counter variable because it was
>>> declared after its scope.
>>
>> The subroutine is never called before $counter is declared, so it is
>> always available to the subroutine.  There should be an error only for
>> instances when the subroutine is called before $counter is declared.
>>
>>> For more information, see:
>>>
>>> * http://www.plover.com/FAQs/Namespaces.html
>>
>> Ok, so perl has a totally broken design with variables :(  What's the
> I don't think so. I think you are not really getting perl and Perl.
> How would you this in another language say C or C++?

I would either declare global variables or, much better, make a data
structure a pointer to which can be handed over to functions easily and
efficiently.

Declaring the variables on top didn't seem a good idea in perl, but
re-reading the documentation it seems that they might never be
accessible from outside the program when declared with 'my'.  If that is
so, declaring them at the top wouldn't be different from declaring
global variables in C.

>> solution to this problem?
> Below is one way of solving this problem:
> <CODE>
> use strict;
> use warnings;
>
> sub test {
>      print shift(@_) . "\n";
>  }
>
>
>  my $counter = 0;
>  while($counter < 5) {
>      test($counter); # pass the variable
>     $counter++;
>  }
> </CODE>
>
>  You can write your test subroutine like this:
>  <CODE>
>  sub test{
>     my $count = shift(@_);
>     print $count,$/;
>  }
> </CODE>
> I would of course not call the subroutine test, using a more
> descriptive name would be better.
> Hope this helps.

Passing a number of variables around to every function that might need
them is what I'm trying to avoid.  When you later modify one of the
functions and it needs more variables, you have to go through all
functions that call the modified function, modify the all the calls of
the modified function and add these variables to the calling functions
as well just so they can pass them over.

When you pass a pointer to a data structure around, you have only one
place to modify (besides modifying the function), which is the
declaration of the data structure.  (And you can get away without global
variables.)

What's the equivalent to passing around a pointer in perl?  You could
pass a hash.  Doing that would create a copy of the hash every time it's
handed over, wouldn't it?  Passing just a pointer is far more beautiful
and doesn't involve the overhead of creating copies.


-- 
"Object-oriented programming languages aren't completely convinced that
you should be allowed to do anything with functions."
http://www.joelonsoftware.com/items/2006/08/01.html

-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to