Smylers writes: > I don't find the Perl 5 approach ugly: I actually like it, because it does > exactly what it looks like it's doing, and doesn't require learning any > special syntax or keyword. > > To have a variable exist beyond outside a sub, you declare it outside that > sub. To prevent that variable being accessed from anywhere else, you put > it in a block. It's simple yet provides the power you need, and it's > completely obvious what's going on.
I disagree that it's simple. #! /usr/bin/perl -lw use strict; print id(); { my $next = 17; # the first ID is 17 sub id { return $next++; } } Unfortunately, that completely fails, because the block containing the declarator hasn't been evaluated the first time you call the sub. So you get 0 as the answer (because ++ is sufficiently magic). It can be fixed by making the block a BEGIN block, but suddenly it doesn't seem so simple. It doesn't help that when you do this in a module, you probably don't see the problem (because 'use Foo;' effectively does a require in a BEGIN block). I'd argue that the requirement for BEGIN when you want a so-called-static variable in your main program (and you define the sub after using it) makes this approach less than simple. In addition, I don't think it 'provides the power you need'. With the Perl5 approach, you can't have so-called-static variables scoped to anything other than (a group of) subroutines -- they can't be scoped to a loop within a sub, for example. -- Aaron Crane * GBdirect Ltd. http://training.gbdirect.co.uk/courses/perl/