Vraag & Antwoord

Programmeren

[Perl] dir lezen

Anoniem
None
11 antwoorden
  • Beste mensen,

    Ik zit nu een beetje vast met Perl. Ik moet met een programma een map lezen en alle bestanden in een scalar gooien. Maar hoe doe ik dit. Ik heb op www.perldoc.com lopen zoeken en ik heb een vermmoeden dat het iets met readdir() is, alleen ik heb hier nog nooit mee gewerkt. Zo moet je dan samen met opendir() werken, alleen dan moet je een map opgeven. Maar hoe doe je dat dan met een map waar je al inzit, bijv:

    Ik zit nu in /home/wwizzkidd en ik heb het programma in die map zitten. Dus ik wil dan alles in /home/wwizzkidd lezen. Maar ik kan dus dit niet opgeven: opendir(DIR,"/home/wwizzkidd"); want dit is niet overal hetzelfde :).

    Hoe los ik zoiets op?

    grtz,
    wwizzkidd
  • opendir DIR, './';
    @array = readdir DIR;
    closedir DIR;
    print @array;
  • Dat in een scalar gooien is wel ok, maar dan krijg je al die bestanden achter elkaar zoals: test.plhallo.plbin.exe enz. Hoe kun je die dan scheiden en dan in bijv. in een array ofzo gooien? ZOdat ik elk bestand later kan gebruiken..

    grtz,
    wwizzkidd
  • Ik zou zeggen: lees eens een perl tutorial of zo, dit is zo basic.

    while (@array){
    print shift @array, "<br>\n";
    }
  • Ugh, shift? :-?
    [code:1:381ddea9c4]# Behind door number 1, we have….
    for (@files) {
    print "$_\n";
    }

    # …. behind door number 2….
    print "$_\n" for @files;

    # …. and behind door number 3….
    print join "\n" => @files;

    # Pick a door and win a trip (or a fridge)![/code:1:381ddea9c4]
  • Och, er zijn vele wegen die naar Rome leiden, in dit geval tientallen. :)
  • Die weg met shift is dan wel een van de lelijkste, bochtigste wegen… De snelweg: [code:1:df9e779d92]$ perl -wle 'print for <*>'[/code:1:df9e779d92]
  • Ach, er is voor alle mogelijkheden iets te zeggen. Print join werkt goed, maar neemt onnodig geheugenruimte in beslag. En printen vanaf de command line is leuk, maar niet echt praktisch in een script. Of je moet system calls gaan doen, en of dat nou de weg is.

    Maar deze thread verandert ondertussen in een wedstrijdje ver pissen, en als jij die graag wilt winnen, dan gun ik je die eer van harte.
  • [quote:d85cda08f8="gerben"]Ach, er is voor alle mogelijkheden iets te zeggen. Print join werkt goed, maar neemt onnodig geheugenruimte in beslag.[/quote:d85cda08f8]

    Alhoewel dat technisch natuurlijk volkomen waar is, is de opmerking wat vreemd aangezien je niet met de volgende lus kwam: [code:1:d85cda08f8]while (readdir(DIR)) {
    print "$_\n";
    }[/code:1:d85cda08f8] De bestandsnamen in een array stoppen alleen om ze vervolgens een voor een er weer uit te gooien is nou niet echt in lijn met je bezorgdheid om een paar bytes geheugen.

    Die join was bedoeld als uitleg aan iemand die niet veel van Perl weet (als wwizzkidd dat wel wist zou hij geen probleem hebben gehad). Het printen van een array zonder lus, join of het (tijdelijk) veranderen van $, zet zo iemand weer voor een vraag: "waarom staan alle bestandsnamen aan elkaar vast?"

    Het kromme van die shift is dat je op die manier maar 1 keer over de bestanden kunt loopen (en waarom zou je ze dan nog in een array stoppen?). Ook nogal verwarrend voor iemand zonder veel ervaring met Perl.

    [quote:d85cda08f8]En printen vanaf de command line is leuk, maar niet echt praktisch in een script. Of je moet system calls gaan doen, en of dat nou de weg is.[/quote:d85cda08f8]

    Wat hebben system-calls hiermee te maken?

    Maar goed, voor jou dan compleet uitgekauwd: [code:1:d85cda08f8]#!/usr/bin/perl -w

    print "Files in current directory:\n";
    print "$_\n" for <*>;[/code:1:d85cda08f8]

    Het gaat trouwens niet om "winnen", het ging erom dat die shift brak is en een beginner alleen van de wal in de sloot helpt.
  • Pssst: je hebt al gewonnen hoor… :-)
  • Whatever.

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.