Schrift
[thread]9154[/thread]

Dateien in einem Verzeichnis auslesen: Problem dabei (Seite 2)



<< |< 1 2 >| >> 18 Einträge, 2 Seiten
sid burn
 2007-07-07 18:06
#78192 #78192
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Code (perl): (dl )
1
2
3
4
5
6
7
#!/usr/bin/perl
use warnings;
use strict;

while ( my $file = glob '*' ) {
    print $file, "\n";
}


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl
use warnings;
use strict;

opendir my $dir, '.'  or  die "Cannot open '.': $!\n";
while ( my $file = readdir $dir ) {
    next if $file eq '.' or $file eq '..';
    print $file, "\n";
}
closedir $dir;


Lösung 1) Sortiert noch automatisch die Namen nach ASCII Alphabet, daher ist es etwas langsamer. Ich denke aber das in den meisten Fällen die Performance genau in diesem Fall eh keine Rolle Spielt.

Wann man etliche Verzeichnisse Rekursiv durchgeht, kann es vielleicht eine Spielen. Aber dann würde ich gleich lieber zu File::Find oder wie hier das bessere genannte File::Find::Rule empfehlen.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
renee
 2007-07-07 18:11
#78193 #78193
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=RPerl,07.07.2007, 15:38]Hallo Leute,

ich hab mir, als ich das posting gelesen habe, ueberlegt, ob und v.a. wie man das ganze auch ohne grep() machen kann.
Zuerst dachte ich daran, mit unshift() oder splice() die ersten beiden Inhalte vom array zu entfernen. Dafuer war ich leider zu bloed. :*([/quote]
Da nicht wirklich sichergestellt ist, dass die beiden ersten Einträge das . und .. sind, würde ich das nicht machen. Die meisten Betriebssysteme machen es zwar, aber es nirgends festgelegt, dass es so sein *muss*
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
RPerl
 2007-07-07 18:17
#78194 #78194
User since
2006-11-26
384 Artikel
BenutzerIn

user image
@ renee: Ja, aber wie wuerde es gehen? Hab es probiert, hat bei mir nicht funktioniert. Kam nur crap :D

@ sid burn: Also 1 verstehe ich gut. Beim zweiten verstehe ich das eq nicht. Muesste es ne sein? .oO Etwas seltsam. Waer ICH nie drauf gekommen. :rock:
renee
 2007-07-07 18:33
#78195 #78195
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Also mit splice würde es so gehen:

Code (perl): (dl )
1
2
3
my @array = qw(1 2 3 4); 
splice(@array,0,2); 
print $_,qq~\n~ for @array


mit shift:
Code (perl): (dl )
1
2
3
4
my @array = qw(1 2 3 4); 
shift @array;
shift @array;
print $_,qq~\n~ for @array


Aber wie gesagt, ich würde nicht "blind" die ersten zwei Elemente aus dem Array werfen...

Bei sid burn ist es vollkommen richtig mit eq. Wenn $file '.' oder '..' ist, dann soll der nächste Eintrag kommen (next). Das was nach next steht wird dann nicht mehr ausgeführt.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
RPerl
 2007-07-07 18:35
#78196 #78196
User since
2006-11-26
384 Artikel
BenutzerIn

user image
Vielen Dank renee!

Quote
Bei sid burn ist es vollkommen richtig mit eq. Wenn $file '.' oder '..' ist, dann soll der nächste Eintrag kommen (next). Das was nach next steht wird dann nicht mehr ausgeführt.
Dieser Satz hat mir sehr geholfen. Nun hab ich das verstanden.

schoenen Tag!

rPerl

// EDIT: Uebrigens: Mit undef muesste es auch gehen.

Code (perl): (dl )
1
2
3
4
5
6
my @array = (0,1,2,3,4,5,6,7,8,9);
undef $array[5];

foreach (@array) {
print if defined;
}


.. aber nicht sehr sauber\n\n

<!--EDIT|RPerl|1183819075-->
sid burn
 2007-07-07 18:38
#78197 #78197
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=RPerl,07.July.2007, 16:17]@ sid burn: Also 1 verstehe ich gut. Beim zweiten verstehe ich das eq nicht. Muesste es ne sein? .oO Etwas seltsam. Waer ICH nie drauf gekommen. :rock:[/quote]
Hmm, nein eigenltich ist das Beispiel doch sehr identisch zu einer Regex.

Anstatt:
Code (perl): (dl )
next if $file =~ m/^..?$/

Schreibe ich halt:
Code (perl): (dl )
next if $file eq '.' or $file eq '..'


Die Regex sagt: "Nächste Datei bitte wenn Zeilenanfang und ein Punkt und Optional ein weiterer Punkt und Zeilende kommt".
Und mit dem eq mache ich direkt zwei abfragen. "Nachste Datei wenn es Punkt oder PunktPunkt ist".
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
pq
 2007-07-07 18:41
#78198 #78198
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
wenn es eh nur dateien sein sollen und keine verzeichnisse - wieso
fragst du dann nicht per -f ab, ob es eine datei ist?
siehe perldoc -f -X
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
renee
 2007-07-07 19:59
#78199 #78199
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=RPerl,07.07.2007, 16:35]// EDIT: Uebrigens: Mit undef muesste es auch gehen.

Code (perl): (dl )
1
2
3
4
5
6
my @array = (0,1,2,3,4,5,6,7,8,9);
undef $array[5];

foreach (@array) {
print if defined;
}


.. aber nicht sehr sauber[/quote]
In diesem Fall werden die Elemente aber nicht entfernt, sondern nur auf "undef" gesetzt. Bei der Methode mit slice bzw. mit shift werden die Element echt entfernt.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2007-07-04 17:24.