31. januar 2004 - 19:32Der er
17 kommentarer og 1 løsning
Brug af sub
Jeg er ved at lave et lille script som returnerer et array over filer og deres placering i en mappe, men når jeg kalder den får den ikke alle filerne rigtigt med, fordi den afslutter lige så snart en af de funktioner der bliver benyttet bliver afsluttet, nogen der har nogen forslag til hvad jeg gør galt?
[code] my $mappe = "test"; my @filer = scan_folder($mappe); foreach $tempNavn (@filer) { print "$tempNavn\n"; }
sub scan_folder { my $dir = $_[0] . "\\"; opendir DIR, $dir or die "Failed to open dir $dir"; my @file = readdir DIR or die "Failed to open $dir/$_: $!"; my $i = 2; while ($file[$i]) { if (open('filehandle', '<', ($dir . "\\" . $file[$i]))) { push(@files, ($dir . $file[$i])); } else { my @temp_file_list = scan_folder(($dir . $file[$i])); foreach $tempName (@temp_file_list) { push(@files, $tempName); } } close('filehandle'); $i++; } closedir DIR; @files; } [/code]
den mappe jeg har angivet, (test) ser sådan her ud
[quote] C:\DOCUME~1\aterra\MYDOCU~1>dir /S test Volume in drive C has no label. Volume Serial Number is 4464-732F
eller hvis i bedre kan overskue mappestrukturen med tree TEST │ test.txt │ test1.txt │ └───test2 │ test3.php │ └───test3 test4.php
Prøv med dette - men jeg tror ikke du generelt skal være 100% sikker på at "." og ".." er de 2 første indgange.
my $mappe = "."; my @filer = scan_folder($mappe); foreach $tempNavn (@filer) { print "$tempNavn\n"; }
sub scan_folder { my $dir = $_[0] . "/"; opendir DIR, $dir or die "Failed to open dir $dir"; my @file = readdir DIR or die "Failed to open $dir/$_: $!"; my $i = 2; while ($file[$i]) { if (-f $dir . $file[$i]) { push(@files, $dir . $file[$i]); } elsif (-d $dir . $file[$i] ) { my @temp_file_list = scan_folder(($dir . $file[$i])); foreach $tempName (@temp_file_list) { push(@files, $tempName); } } $i++; } closedir DIR; @files; }
hmmm, ved ikke lige helt hvad der skete det, er lidt underligt, måske noget at gøre med at de er ved at lege med deres servere nu TEST │ test.txt │ test1.txt │ └───test2 │ test3.php │ └───test3 test4.php
Der er ikke noget i min kode der afhænger af versionen. Din kode er ikke synderligt effektiv, men virker da. Er det **præcis** min kode du forsøger at afvikle?
stortset, rettede mappe navnet til test, men prøvede lige at rette det tilbage igen til ".", så virker det, burde jeg ikke kunne specificere et mappe navn?
ja, bortset fra at det står det 3 gange og at det mangler en fil, prøver lige at lave en tree manuelt TEST | test.txt | test1.txt | |---test2 | test3.php | |---test3 test4.php
Jeg kan ikke se hvorfor den skulle gøre det 3 gange med min kode. Men skal vi snakke effektivitet, og det skal vi, hvis du skal i gang med bare lidt flere og lidt større kataloger, så er det nedenstående du skal bruge. Din version kopierer filnavnene utallige overflødige gange. Man kan gøre andet, men et global @files er umiddelbart det nemmeste. Prøv det:
kanon, nu virker det mange tak, men effektiviteten på det her script er tæt på ligegyldigt, da der alligevel skal arbejdes sammen med an webserver for hver fil, hvilket tager adskillige sekunder pr. fil :), men mange tak du kan få point hvis du vil (ved du ikke altid vil) eller jeg kan bare selv lukke den.
Trist vi ikke fik opklaret hvorfor den gjorde det 3 gange. Og det var altså nødvendigt med den bedre effektivitet - tro mig ;)) Og ellers tak, jeg skal ikke have point.
okay, bruger også dit script, da det ser bedre ud, takker igen så
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.