ASPN ActiveState Programmer Network
ActiveState
/ Home / Perl / PHP / Python / Tcl / XSLT /
/ Safari / My ASPN /
Cookbooks | Documentation | Mailing Lists | Modules | News Feeds | Products | User Groups


Recent Messages
List Archives
About the List
List Leaders
Subscription Options

View Subscriptions
Help

View by Topic
ActiveState
.NET Framework
Open Source
Perl
PHP
Python
Tcl
Web Services
XML & XSLT

View by Category
Database
General
SOAP
System Administration
Tools
User Interfaces
Web Programming
XML Programming


MyASPN >> Mail Archive >> perl-unix-users
perl-unix-users
Re: [Perl-unix-users] Random number
by Poul H. Sorensen other posts by this author
Jan 31 2008 3:22AM messages near this date
Re: [Perl-unix-users] Random number | Re: [Perl-unix-users] Random number
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 fi
le
	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=Ahu06i62sR8HDtDypao8Wcj9t
AcJ 
>   >
>  
>  
>  ------------------------------------------------------------------------
>  
>  _______________________________________________
>  Perl-Unix-Users mailing list
>  Perl-Unix-Users@[...].com
>  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
Perl-Unix-Users@[...].com
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs
Thread:
Gary Yang
Casteele/ShadowLord
Poul H. Sorensen
Ingo Schwarze
Bill Luebkert
Suresh Govindachar

Privacy Policy | Email Opt-out | Feedback | Syndication
© ActiveState Software Inc. All rights reserved