Thread Probleme mit grep
(4 answers)
Opened by Fabian at 2010-01-05 14:09
zunächst mal ist der backslash vor dem punkt in $filter völlig unnötig, denn er verschwindet sowieso und ist dann in $filter selbst nicht mehr vorhanden. was dann bedeutet, dass er in anwendung der regex als punkt, also beliebiges zeichen, gedeutet wird.
wenn du einen backslash in einen string schreibst, der mit double-quotes geschrieben wird, dient der slash zum escapen von irgendetwas, z.b. dem dollarzeichen. statt "$foo" schreibt man also "\$foo" wenn man wirklich ein dollarzeichen haben will. im string steht dann letztendlich $foo wenn du also schreibst "\.log\$" steht im resultierenden string leider nur noch .log$ wenn du also eine regex mit einem escapten punkt haben willst, kannst du entweder my $filter = ".*\\.log\$"; oder my $filter = qr{.*\.log$}; schreiben. das zweite mit dem qr{} ist sozusagen schon ein regex-quoting. das ganze erklärt noch nicht, warum manche dateien nicht mit im array landen, obwohl sie .log heissen, aber es ist gut, solche fehler erstmal zu beseitigen. was du jetzt machen kannst: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 use Data::Dumper; $Data::Dumper::Useqq = 1; my @zippeintraege = grep { if (m/$filter/) { 1 } else { print "Did not match '$filter':\n"; print Dumper $_; 0 } } readdir(DIR); dann siehst du genau, wo es nicht matcht, und bekommst die variable nochmal angezeigt. vielleicht landen ja schon einige einträge gar nicht in der schleife. man sollte sowas immer prüfen, da man sonst den fehler vielleicht an der ganz falschen stelle sucht. 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: Wie frage ich & perlintro brian's Leitfaden für jedes Perl-Problem |