In my post I've missed the 'd' token in "%05d"
Here are a few possible solutions that will do all the work for you
Apache/UUID.pm
--------------
package Apache::UUID;
use strict;
my($base, $seq);
die "Cannot push handlers" unless Apache->can('push_handlers');
init();
sub init {
Apache->push_handlers(
PerlChildInitHandler => sub {
$seq = 0;
$base = $^T . sprintf("%05d", $$);
1;
});
}
sub id { $base . $seq++; }
#sub format { ... }
1;
__END__
startup.pl
----------
use Apache::UUID; # must be loaded at the startup!
test.pl
--------
use Apache::UUID;
print "Content-type: text/plain\n\n";
print Apache::UUID::id();
Since I've used $^T token, the module must be loaded at the startup, or
someone may modify $^T. If you use time(), you don't need the child init
handler (but you pay the overhead). and can simply have:
package Apache::UUID;
use strict;
my($base, $seq);
sub id {
$base ||= time . sprintf("%05d", $$);
$base . $seq++;
}
1;
the nice thing about the childinit handler is that at run time you just
need to "$base . $seq++;". but probably this second version is just fine.
also you probably want to add a format() function so you get the ids of
the same width.
another improvement is to use pack(), which will handle sprintf for you
and will create a number which is more compact and always of the same width:
package Apache::UUID;
use strict;
my $seq;
sub id { unpack "H*", pack "Nnn", time, $$, $seq++;}
1;
Another problem that you may need to tackle is predictability... but
that's a different story.
__________________________________________________________________
Stas Bekman JAm_pH ------> Just Another mod_perl Hacker
http://stason.org/ mod_perl Guide ---> http://perl.apache.org
mailto:[EMAIL PROTECTED] http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org http://ticketmaster.com