Schrift
[thread]12899[/thread]

regex mit 2 Variablen

Leser: 2


<< >> 8 Einträge, 1 Seite
Gast Gast
 2008-12-12 18:54
#117132 #117132
Hallo Zusammen, habe folgenden Code
Code: (dl )
if($file =~ m/($fileformat)/)

$file = movie.avi
$fileformat = .avi

Nur gibt es mit IMMER false zurück. was habe ich falsch gemacht?
Wenn ich ($fileformat) mit beispielsweis avi ersetze funktioniert es.
pq
 2008-12-12 19:16
#117134 #117134
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
hm, funktioniert doch:
Code: (dl )
1
2
3
4
5
6
7
$ perl -wle'
my $file = "movie.avi";
my $fileformat = ".avi";
if ($file =~ m/($fileformat)/) {
print "match";
}'
match

du solltest aber den punkt mit einem backslash escapen, der punkt an sich steht für "alles ausser newline".
Code: (dl )
1
2
3
4
5
6
7
$ perl -wle'
my $file = "movie.avi";
my $fileformat = "\\.avi";
if ($file =~ m/($fileformat)/) {
print "match";
}'
match
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
Gast Gast
 2008-12-12 19:31
#117135 #117135
hm stimmt... wen ichs so mache gehts...
Also ich habe folgenden Code
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
use strict;
use warnings;
#---to configure---
#MySQL DB setting
my $user = 'bla';
my $password = 'bla';
my $host = 'localhost';
my $database = 'bla';
my $table = 'bla';
#else
my @paths = ('/home/matthias/Videos','/mnt/next/g/multimedia/filme','/home/matthias/ttt');
my @fileformats = ('avi','mpg','mpeg','bin');
#---to configure end---
my $check;
my $file;
for my $path (@paths) {         
        if(-d $path){
                search($path);
        }else{
                logP->wirteLog("Path ".$path." don't exist\n");
        }
}
                
sub checkFileFormat{
        my $file = shift;
        for my $fileformat (@fileformats){
                if($file =~ m/($fileformat)/){$check=1;}
                else{$check=0;}
        }
}               
                
sub search{
        local *DIR;
        my $path = shift;
        opendir(DIR,$path);
        while($file = readdir(DIR)) { 
                if(($file ne ".") && ($file ne "..")){
                        if(-d $path."/".$file){                         
                                search($path."/".$file);
                        }else{
                                checkFileFormat($file);
                                if($check==1){
                                        print($check." ".$path."/".$file."\n");
                                }else{
                                        print($check." ".$path."/".$file."\n");
                                }
                        }
                }
        }
        closedir(DIR);
}


aber so wird $check IMMER 0 :(
GwenDragon
 2008-12-12 19:51
#117137 #117137
User since
2005-01-17
14747 Artikel
Admin1
[Homepage]
user image
Wenn du rekursiv den Pfad durchsuchen willst, benutze bitte nicht
local *DIR
für das Dateihandle sondern meinetwegen
my $dir

Dateihandles kannst du auch mit CPAN:FileHandle erzeugen.
Und Dateien finden mit CPAN:File::Find
pq
 2008-12-12 19:52
#117138 #117138
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
du überschreibst ja die variable $check immer wieder. wenn die datei das letzte fileformat
nicht matcht, ist es dann halt am ende 0.
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
pq
 2008-12-12 19:54
#117139 #117139
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
bei deiner regex matchst du übrigens nur auf jeweils "avi", "mpg", etc.
eine datei namens avi.mpg würde darauf auch matchen.
du brauchst den punkt, wie ich es dir gezeigt habe, und du musst die regex verankern.
lies mal perlintro und perlretut in unserem wiki.
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
 2008-12-12 20:04
#117140 #117140
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du solltest bei einem erfolgreichen Match noch die Schleife abbrechen. Denn was im Moment passiert ist folgendes:

Code: (dl )
1
2
3
4
5
6
7
8
9
file => test.avi

schleifenbeginn
prüfe ob test.avi "avi" enthält
setze check auf 1
prüfe ob test.avi "mpg" enthält
setze check auf 0
prüfe ob test.avi "bin" enthält
setze check auf 0


Du siehst, dass Du bei jeder Datei, die *nicht* "bin" enthält check am Schluss auf "0" steht.

Du musst bei einem erfolgreichen Test die Schleife abbrechen, also

Code (perl): (dl )
if($file =~ m/($fileformat)/){$check=1; last;}


(siehe perldoc -f last)
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/
Gast Gast
 2008-12-13 11:53
#117154 #117154
renee+2008-12-12 19:04:03--
Du solltest bei einem erfolgreichen Match noch die Schleife abbrechen.

OOooohhh ich depp... vielen Dank für den Tipp. Habe ich übersehen :-/
pq
bei deiner regex matchst du übrigens nur auf jeweils "avi", "mpg", etc.
eine datei namens avi.mpg würde darauf auch matchen.

Ja das hatte ich schon noch im Hinterkopf :-) Wollte erstmal dieses Problem lösen. Aber Danke für den Hinweis. Habe jetz folgendes:
Code (perl): (dl )
1
2
3
4
my @fileformats = ('\\.avi','\\.mpg','\\.mpeg','\\.bin');
...
if($file =~ m/($fileformat)$/){$check=1; last;}   #$string =~ m/Bill Clinton$/; 
                else{$check=0;}

GwenDragon
Wenn du rekursiv den Pfad durchsuchen willst, benutze bitte nicht
local *DIR
für das Dateihandle sondern meinetwegen
my $dir

OK, hab ich gemacht ;-)
<< >> 8 Einträge, 1 Seite



View all threads created 2008-12-12 18:54.