Gary Yang wrote:
> Hi,
>
> I need to get a random number whenever the perl script is called. Each
> time the random number I got should be different. I use that number to
> name generated files, i.e. I want the perl script to generate different
> file names whenever it is called. Can someone tell me how to get the
> different random number whenever the perl script is called?
A different random number, that is a contradiction:-)
You could start with rand() [ perldoc -f rand ], but you would
still have to check to see if the file existed!
Anothor method is [ perldoc -q temporary ], guides you to File::Temp
but this is mostly intended for temporary files that (in most cases) disappear
when closed.
Depending on you needs, create a filename that is a combination of
hostname
clientname
$^T - secs since epoch # sorts nicely
sprintf("%4.4d%2.2d%2.2dT%2.2d%2.2d%2.2d", 1900+$t[5],
$t[4]+1,@t[3,2,1,0]);
where @t = gmtime($^T); # or localtime($^T); # both variants
sorts nicely
$$ - PID
rand() - a random number <1
Andn if you need to be _really_ sure:
>From perlopentut :
And here are things you can do with "sysopen" that you
cannot do with a regular "open". As you'll see, it's just a
matter of controlling the flags in the third argument.
To open a file for writing, creating a new file which must
not previously exist:
sysopen(FH, $path, O_WRONLY | O_EXCL | O_CREAT);
Leading to something like:
# construct a nice meaningful filename in $path, maybe using the some
of the above methods...
use IO::File;
sysopen(FH, $path , O_WRONLY|O_EXCL|O_CREAT) or die "$0: $path: $!";
print FH "ok\n";
where you actually may change the "or die" to a loop:
$path="foo00";
until( sysopen(FH, $path, O_WRONLY|O_EXCL|O_CREAT) ) { $path++; };
print "Got: $path\n";
But - you end up in a longer and longer loop, and end in trouble if you
can't create the file
for some other reason.
use strict;
use warnings;
use Sys::Hostname;
use IO::File;
my $dir="/var/tmp";
my @ts = gmtime(time());
my $prefix = sprintf("%s-%4.4d%2.2d%2.2dT%2.2d.%2.2d-%d",
Sys::Hostname::hostname,
1900+$ts[5], $ts[4]+1, @ts[3,2,1,0],
$$,
);
my $suffix = 'txt';
my $maxtry=10;
my $success=0;
my $i = 0;
while ( $i < $maxtry ) {
my $path = sprintf("%s/%s-%d.%s", $dir, $prefix, $i, $suffix);
if ( sysopen(FH, $path , O_WRONLY|O_EXCL|O_CREAT)) {
$success=1;
last;
} else {
die "$0: $path: $!" unless $! =~ /file exists/i;
$i++;
}
}
die "$0: failed to create unique file - tried $i times" unless $success;
> I greatly appreciate your help.
>
>
> Gary
>
>
>
> ------------------------------------------------------------------------
> Be a better friend, newshound, and know-it-all with Yahoo! Mobile. Try
> it now.
> <http://us.rd.yahoo.com/evt=51733/*http://mobile.yahoo.com/;_ylt=Ahu06i62sR8HDtDypao8Wcj9tAcJ
>
> >
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Perl-Unix-Users mailing list
> [email protected]
> To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs
--
print $Std{'Disclaimer'};
$CC = +-1; # the Computer Constant - very useful when writing loops. #
$|=printf "Just another [lazy] %s hacker\r",("PERL","perl")[$i+sleep 1] #
while $i=$i?0:$CC,1; ###
__EOF__
_______________________________________________
Perl-Unix-Users mailing list
[email protected]
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs