/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
Unikke navne
Fra : Jimmy


Dato : 31-03-03 13:04

Hej

Jeg skal have gemt en række filer i et bibliotek.

Navnene skal derfor være unikke.

Jeg anvender følgende til dette:

my $random = int(rand(400001)) + 100000;
my $file = time() . "__" . $random;

Scriptet fejler, hvis det indenfor samme tidsrum rammer samme tilfældige tal
to gange.

Ovenstående er sikkert ikke "the Perl way" og jeg vil derfor høre, hvordan I
ville gøre det?

Mvh
Jimmy



 
 
Peter Makholm (31-03-2003)
Kommentar
Fra : Peter Makholm


Dato : 31-03-03 13:11

"Jimmy" <nyhedsgruppe@get2net.dk> writes:

> Jeg skal have gemt en række filer i et bibliotek.

Den rigtige måde ville nok være at se på File::MkTemp;

> my $random = int(rand(400001)) + 100000;
> my $file = time() . "__" . $random;
>
> Scriptet fejler, hvis det indenfor samme tidsrum rammer samme tilfældige tal
> to gange.

my $file;
do {
my $random = int(rand(400001)) + 100000;
$file = time() . "--$random";
} until (! -e $file);

Sikre dig mod at filen eksistere når du vælger filnavnet. Sålænge du
kun har en tråd/process kørende der danner filnavne på denne måde
skulle det virke.

Men se på File::MkTemp.

--
Peter Makholm | What if:
peter@makholm.net | Tannenbaum had convinced Linus that his
http://hacking.dk | operating system really was obsolete

Flemming Frandsen (02-04-2003)
Kommentar
Fra : Flemming Frandsen


Dato : 02-04-03 12:09

Peter Makholm wrote:
>>Jeg skal have gemt en række filer i et bibliotek.
> Den rigtige måde ville nok være at se på File::MkTemp;

Yep, den bedste kode er den du ikke selv skriver, brug cpan.


Et hint som nok er værd at komme med i denne sammenhæng er: $$

Hvis filen kun skal bruges inden for den samme process så er det
populært at bruge $$ (process id) i navnet, evt. sammen med en tæller
hvis der skal laves mere end en fil.

Hvis filen skal være globalt unik også efter processen er stoppet, så
tag tiden med, jeg er helt sikker på at et process id ikke bliver
genbrugt inden for 1 sekund, så dette vil med sikkerhed give alle de
unikke navne du kunne ønske dig, uden du skal til at lave for mange stat
kald (-e laver en stat):

my $count = 0;

while (1) {
$count++;
my $fn = "/tmp/sager.$$.$count.".time;

...
}

Hvis navnene skal være ugættelige (sikkerhed og noget) så put noget
randomagtigt ind sammen med det oven for.

.... men glem det og brug File::MkTemp hvis du kan.

--
Regards Flemming Frandsen - http://dion.swamp.dk
PartyTicket.Net co founder & Yet Another Perl Hacker


Søg
Reklame
Statistik
Spørgsmål : 177428
Tips : 31962
Nyheder : 719565
Indlæg : 6407938
Brugere : 218877

Månedens bedste
Årets bedste
Sidste års bedste