reguläre Ausdrücke
|
Seitenanfang |
| Hallo, bin grad bei meiner Schulaufgebenvorbereitung über eine Zeile Perl Code gestolpert, die mir nicht so recht einleuchtet. Veleicht kann mir jemand weiterhelfen. Was passiert hier? ($pattern=$_ and last) unless ($pattern);
Datum: 22.03.2006-21:15

|
re: reguläre Ausdrücke
|
Seitenanfang |
| Sie bedeutet: Verlasse die Schleife wenn es die Variable $pattern nicht gibt* und speichere beim Verlassen den Wert von $_** in $pattern. *eigentlich bedeutet es wenn $pattern undef,0 oder "" ist. definiertheit überprüft man mit defined [http://perldoc.perl.org/functions/defined.html] **$_ ist eine spezielle Variable die in Schleifen immer einen Alias für das Element darstellt über das gerade iteriert wird [also da wo die Schleife grad is']) also foreach(1,2,3) { print '$_=',$_,"\n"; } gibt $_=1 $_=2 $_=3 aus
Datum: 22.03.2006-22:04

|
re: reguläre Ausdrücke
|
Seitenanfang |
| danke erst mal, ich finde folgenden Quellcode aber immernoch seltsam. while (<>){ chomp; ($pattern=$_and last) unless($pattern); if (/$pattern/) { print"Matched:$`<$&> $'\n; }else { print "no Match\n"; } } ist das so korrekt?
Datum: 22.03.2006-22:34

|
re: reguläre Ausdrücke
|
Seitenanfang |
| Ja, bis auf 2 kleine Schreibfehler die drin waren. Ich habs dir mal kommentiert. Hier noch n paar Info-Seiten: http://de.selfhtml.org/perl/sprache/regexpr.htm http://perldoc.perl.org/perlre.html http://perldoc.perl.org/perlreref.html #!/usr/bin/perl -w use strict; my $pattern = '\d{3}'; # suchmuster-beispiel : 3 ziffern am stück while (<>){ # lies von der standardeingabe (kurzform von <STDIN>) chomp; # entferne whitespace am ende (zeilenumbruch) ($pattern = $_ and last) unless($pattern); # wenn es noch kein pattern gibt : schleife beenden und $_ als $pattern verwenden if (/$pattern/) { # wenn das suchmuster einen treffer landet print"Matched:$` <$&> $'\n"; # den teil vor dem treffer,den treffer und den teil nach dem treffer ausgeben } else { print "no Match\n"; } } # eingabe von abc123def # ergibt : Matched:abc <123> def
Datum: 22.03.2006-23:54

|
re: reguläre Ausdrücke
|
Seitenanfang |
| Achso, verwirrend für dich ist vielleicht auch das Ausnutzen des Standardverhaltens von chomp und dem regulären Ausdruck in dem Beispiel. Wenn sie ohne Argument aufgerufen werden nehmen Sie beide einfach $_ als Argument. Also macht das Programm eigentlich das: while (<STDIN>){ chomp $_; #!! ($pattern = $_ and last) unless($pattern); if ($_ =~ /$pattern/) { #!! print"Matched:$` <$&> $'\n"; } else { print "no Match\n"; } }
Datum: 23.03.2006-00:00

|
re: reguläre Ausdrücke
|
Seitenanfang |
| Ok, langsam dämmerts :-). Danke nochmal für die schnelle Hilfe und die ausführliche Erklärung.
Datum: 23.03.2006-13:20

|
re: reguläre Ausdrücke
|
Seitenanfang |
#!/usr/bin/perl -w use strict;my $pattern; while (){ while (<>){ chomp; ($pattern = $_ and last) unless($pattern); if (/$pattern/) { print"Matched:$` <$&> $'\n"; } else { print "no Match\n"; } } } Jetzt hat das Speichern von <STDIN> in $_ für dieses kurze Progrämmchen auch einen Sinn.
Datum: 23.03.2006-20:51

|
re: reguläre Ausdrücke
|
Seitenanfang |
Ups!! Natürlich meine ich das Speichern von $_ in $pattern.
Datum: 23.03.2006-20:54

|