Avatar billede cybermouse Nybegynder
31. januar 2004 - 19:32 Der 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

Directory of C:\DOCUME~1\aterra\MYDOCU~1\test

31-01-2004  18:09    <DIR>          .
31-01-2004  18:09    <DIR>          ..
31-01-2004  14:46                5 test.txt
31-01-2004  14:46                5 test1.txt
31-01-2004  18:15    <DIR>          test2
              2 File(s)            10 bytes

Directory of C:\DOCUME~1\aterra\MYDOCU~1\test\test2

31-01-2004  18:15    <DIR>          .
31-01-2004  18:15    <DIR>          ..
31-01-2004  18:15    <DIR>          test3
31-01-2004  14:59                9 test3.php
              1 File(s)              9 bytes

Directory of C:\DOCUME~1\aterra\MYDOCU~1\test\test2\test3

31-01-2004  18:15    <DIR>          .
31-01-2004  18:15    <DIR>          ..
31-01-2004  18:15                7 test4.php
              1 File(s)              7 bytes

    Total Files Listed:
              4 File(s)            26 bytes
              8 Dir(s)  14.459.564.032 bytes free

[/quote]
På forhånd tak
Cybermouse
Avatar billede cybermouse Nybegynder
31. januar 2004 - 19:40 #1
eller hvis i bedre kan overskue mappestrukturen med tree
TEST
&#9474;  test.txt
&#9474;  test1.txt
&#9474;
&#9492;&#9472;&#9472;&#9472;test2
    &#9474;  test3.php
    &#9474;
    &#9492;&#9472;&#9472;&#9472;test3
            test4.php
Avatar billede erikjacobsen Ekspert
31. januar 2004 - 19:40 #2
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;
}
Avatar billede cybermouse Nybegynder
31. januar 2004 - 19:41 #3
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
&#9474;  test.txt
&#9474;  test1.txt
&#9474;
&#9492;&#9472;&#9472;&#9472;test2
    &#9474;  test3.php
    &#9474;
    &#9492;&#9472;&#9472;&#9472;test3
            test4.php
Avatar billede cybermouse Nybegynder
31. januar 2004 - 19:44 #4
erikjacobsen >>stadigt samme problem
Avatar billede erikjacobsen Ekspert
31. januar 2004 - 19:45 #5
Det virker fint hos mig.
Avatar billede cybermouse Nybegynder
31. januar 2004 - 19:47 #6
hvad fortolker bruger du, jeg tester med active perl?
Avatar billede cybermouse Nybegynder
31. januar 2004 - 19:49 #7
helt præcist "This is perl, v5.6.1 built for MSWin32-x86-multi-thread
(with 1 registered patch, see perl -V for more detail)"
Avatar billede erikjacobsen Ekspert
31. januar 2004 - 19:58 #8
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?
Avatar billede cybermouse Nybegynder
31. januar 2004 - 20:02 #9
helt præcist får jeg flg outout
C:\DOCUME~1\aterra\MYDOCU~1>test1.pl
test/test.txt
test/test1.txt
test/test2/test3/test4.php
test/test.txt

C:\DOCUME~1\aterra\MYDOCU~1>
test/test1.txt
test/test2/test3/test4.php
test/test2/test3.php
test/test.txt
test/test1.txt
test/test2/test3/test4.php
test/test.txt
test/test1.txt
test/test2/test3/test4.php
test/test2/test3.php
Avatar billede cybermouse Nybegynder
31. januar 2004 - 20:05 #10
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?
Avatar billede erikjacobsen Ekspert
31. januar 2004 - 20:07 #11
Jeg forstår ikke helt dit output. Det nederste er vel det korrekte, eller hvad?
Avatar billede cybermouse Nybegynder
31. januar 2004 - 20:09 #12
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
Avatar billede cybermouse Nybegynder
31. januar 2004 - 20:10 #13
hov, sorry alle filerne er med, er bare mig der så forkert på grund af rækkefølgen, men hvorfor skriver den det ud 3 gange?
Avatar billede erikjacobsen Ekspert
31. januar 2004 - 20:17 #14
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:

my $mappe = "C:/public_html";
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/$_: $!";
    closedir DIR;
    foreach $file (@file) {
      if ($file eq "." || $file eq "..") {
        next;
      } elsif (-f $dir . $file) {
        push(@files, $dir . $file);
      } elsif (-d $dir . $file) {
        scan_folder($dir . $file);
      }
    }
}
Avatar billede erikjacobsen Ekspert
31. januar 2004 - 20:18 #15
Hov, et sted @filer, et andet @files ;)  Ret
    foreach $tempNavn (@filer) {
til
    foreach $tempNavn (@files) {
Avatar billede cybermouse Nybegynder
31. januar 2004 - 20:27 #16
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.
Avatar billede erikjacobsen Ekspert
31. januar 2004 - 20:31 #17
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.
Avatar billede cybermouse Nybegynder
31. januar 2004 - 20:35 #18
okay, bruger også dit script, da det ser bedre ud, takker igen så
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester