Schrift
[thread]5721[/thread]

Glob nicht mit Dateien ?

Leser: 1


<< |< 1 2 >| >> 14 Einträge, 2 Seiten
BrownWolf
 2003-09-15 18:52
#52081 #52081
User since
2003-08-15
308 Artikel
BenutzerIn
[default_avatar]
Hallo,
ich wollte den glob Befehl benutzen um aus einem Verzeichnis auszulesen wieviele .txt Dateien mit einem bestimmten Teil anfangen. Dazu habe ich genommen:

Code (perl): (dl )
my @comments = grep { $_ =~ /^$benutzer/ } <$config{cards}/comments/*.txt>;


Jedoch bekomme ich eine leere Ausgabe. Woran liegt das ?
Mit opendir funktioniert es. Aber das ist mir zuviel Code !!!
Code (perl): ()
1
2
3
sub _{s;;xrqIpiql\\{}p{pl{R>rl{N{}gjwpkssq]>rl{N;;;*{{}=*{_};;
&#36{{}={q{{{}}}=>[reverse+split+reverse+q;}{;]};&#36{{}->{q{{{}}}}->[@{{}];}
&#36{{}=reverse+_(q{{}}=>q{{}})^chr(30)x+length&_(q{{}}=>,q{{}})and+print;
coax
 2003-09-15 19:18
#52082 #52082
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Ein bisschen Debugging und das Rätsel wäre gelöst.

Code (perl): (dl )
print "$_\n for <$config{cards}/comments/*.txt>


Du würdest sehen das der glob-Operator nicht nur die Dateinamen der gefundenen Dateien sondern auch deren Pfad zurücklieferen.

Statt den Dateinamen bekommst du in etwa so etwas zurück

/pfad/comments/coax.txt

jetzt prüfst du auf den Benutzernamen am Stringanfang:

Code: (dl )
 $_ =~ /^$benutzer/ 

das kann nicht matchen da /pfad am Stringanfang steht.

Quote
Mit opendir funktioniert es. Aber das ist mir zuviel Code !!!

warum dann nicht gleich so... ?
Code: (dl )
my @comments = <$config{cards}/comment/$buntzer*.txt>;


ist imho viel kürzer ;-)



hier mal ein kurzes Beispiel mit Ausgabe um das Problem noch ein wenig veranschaulichen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
print "mit opendir:\n";
print "-" x 80,"\n";

opendir(DH, './') or die $!;
print "$_\n" for grep { /\.pl$/} readdir(DH);
closedir(DH);

print "\nglob mit Pfad:\n";
print "-" x 80,"\n";

print "$_\n" for <./*.pl>;

print "\nglob ohne Pfad:\n";
print "-" x 80,"\n";

print "$_\n" for <*.pl>;

Quote
Ausgabe:

mit opendir:
--------------------------------------------------------------------------------
gui.pl
ircconn.pl

glob mit Pfad:
--------------------------------------------------------------------------------
./gui.pl
./ircconn.pl

glob ohne Pfad:
--------------------------------------------------------------------------------
gui.pl
ircconn.pl
,,Das perlt aber heute wieder...'' -- Dittsche
BrownWolf
 2003-09-15 19:23
#52083 #52083
User since
2003-08-15
308 Artikel
BenutzerIn
[default_avatar]
Manchmal wunder ich mich sogar, wie blöd ich sein kann !
Danke für die Erklärung. ;-)
Code (perl): ()
1
2
3
sub _{s;;xrqIpiql\\{}p{pl{R>rl{N{}gjwpkssq]>rl{N;;;*{{}=*{_};;
&#36{{}={q{{{}}}=>[reverse+split+reverse+q;}{;]};&#36{{}->{q{{{}}}}->[@{{}];}
&#36{{}=reverse+_(q{{}}=>q{{}})^chr(30)x+length&_(q{{}}=>,q{{}})and+print;
coax
 2003-09-15 19:28
#52084 #52084
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
[quote=BrownWolf,15.09.2003, 17:23]Manchmal wunder ich mich sogar, wie blöd ich sein kann !
Danke für die Erklärung. ;-)[/quote]
Don't Panic! :)
,,Das perlt aber heute wieder...'' -- Dittsche
BrownWolf
 2003-09-15 19:30
#52085 #52085
User since
2003-08-15
308 Artikel
BenutzerIn
[default_avatar]
Und ich habe direkt einen Lösungsvorschlag gefunden.

Code (perl): (dl )
my @comments = grep { (split /\//, $_)[-1] =~ /^$username/ } <$config{cards}/comments/*.txt>;


So schaut er hinter dem letzten Schrägstrich nach und filtert die raus wo am anfang $username ist.
Ich musste das so machen weil hinter dem $username was unbekanntes kommt.

Also zb:

username_83575.txt

usw.

BrownWolf
Code (perl): ()
1
2
3
sub _{s;;xrqIpiql\\{}p{pl{R>rl{N{}gjwpkssq]>rl{N;;;*{{}=*{_};;
&#36{{}={q{{{}}}=>[reverse+split+reverse+q;}{;]};&#36{{}->{q{{{}}}}->[@{{}];}
&#36{{}=reverse+_(q{{}}=>q{{}})^chr(30)x+length&_(q{{}}=>,q{{}})and+print;
coax
 2003-09-15 19:36
#52086 #52086
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
siehe oben
Code: (dl )
my(@comments) = <$config{cards}/comments/$benutzername_*.txt>;


edit:

nur den Dateinamen in @comments
Code: (dl )
1
2
3
4
5
6
7
8
9
#!/usr/bin/perl
use strict;
use warnings;

use File::Basename;

my(@comments) = map {basename($_)} <$config{cards}/$benutzername_*.txt>;

print "$_\n" for @comments;
\n\n

<!--EDIT|coax|1063640621-->
,,Das perlt aber heute wieder...'' -- Dittsche
[E|B]
 2003-09-15 21:11
#52087 #52087
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Wieso machst du es so kompliziert?

Code: (dl )
1
2
3
opendir(D, "data");
@data = grep{$_ =~ /\.txt$/i} readdir(D);
closedir(D);


IMHO die schnellste Variante! ;)
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
pq
 2003-09-15 22:06
#52088 #52088
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=BrownWolf,15.09.2003, 16:52]Mit opendir funktioniert es. Aber das ist mir zuviel Code !!![/quote]
zuviel code? machst du bei einem perlgolf-wettbewerb mit oder was?
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
BrownWolf
 2003-09-15 22:11
#52089 #52089
User since
2003-08-15
308 Artikel
BenutzerIn
[default_avatar]
*nick*

Edit:

Ihr versteht nicht was ich meine.
Er soll alle Dateien rausfiltern die am Anfang $username enthalten. Danach kommt doch eine UNBEKANNTE (!) Zahl.

Zb:

username_4729.txt
username_2714.txt
username_8471.txt

Bei [E|B] würde er nur alle .txt Dateien rausfiltern.
Bei dem Beispiel von Coax würde er keine Dateien auflisten.

Weil er nach "username_.txt" sucht. Aber hinter dem _ kommt ja noch eine Zahl :P\n\n

<!--EDIT|BrownWolf|1063649672-->
Code (perl): ()
1
2
3
sub _{s;;xrqIpiql\\{}p{pl{R>rl{N{}gjwpkssq]>rl{N;;;*{{}=*{_};;
&#36{{}={q{{{}}}=>[reverse+split+reverse+q;}{;]};&#36{{}->{q{{{}}}}->[@{{}];}
&#36{{}=reverse+_(q{{}}=>q{{}})^chr(30)x+length&_(q{{}}=>,q{{}})and+print;
Dubu
 2003-09-15 22:50
#52090 #52090
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Vielleicht hast du das Sternchen '*' bei coax uebersehen?
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2003-09-15 18:52.