On Tue, 2005-10-18 at 11:01 +0100, John ORourke wrote:
> 'my' means that it is local to the main program, so your subroutine
> won't see that version of "$counter". Your subroutine will create and
> access a global version of "$counter" which is separate and doesn't get
> re-initialised.

Good guess, but that's not what is happening here.  What our flowery
friend has stumbled onto is a closure.  When a subroutine references a
"my" variable that was declared outside of that subroutine's scope, the
sub will keep a private copy of that variable.  If it wasn't a closure,
it would have just printed "1" over and over.  To avoid creating a
closure, you declare the "my" variable inside the subroutine's scope:

sub increment_counter {
    my $counter;
    $counter++;
    print "Counter is equal to $counter !\r\n";
}

But that will never go above 1.

Here's one way to get the intended result without using a global
("our"):

#!/usr/bin/perl -w
use strict;
use warnings;
  
print "Content-type: text/plain\r\n\r\n";

my $counter = 0;

for (1..5) {
    $counter = increment_value($counter);
    print "Counter is equal to $counter !\r\n";
}

sub increment_value {
    my $value = shift;
    $value++;
    return $value;
}

- Perrin

Reply via email to