Schrift
[thread]8394[/thread]

regexp als Funktionsparameter übergeben



<< >> 2 Einträge, 1 Seite
Gast Gast
 2006-10-06 13:43
#70560 #70560
Hallo,
ich möchte eine Funktion bauen, die aktiv auf den Empfang einer bestimmten Zeichenfolge über die serielle Schnittstelle wartet. D.h. die Funktion wird beendet, wenn eine Zeichenfolge empfangen wurde, die einem als Parameter zu übergebenden reg. Ausdruck matcht oder ein timeout erreicht wurde. Hier ein Beispiel für den Aufruf:
Code: (dl )
waitFor(/OK|ERROR|\+CME ERROR: *(0-9)+/, 5.0);  # warte 5s auf 'OK' oder 'ERROR' oder '+CME ERROR:<errorCode>

bisher sieht meine Kreation so aus, dass ich den reg. Ausdruck als String übergebe:
Code: (dl )
waitFor("OK|ERROR|\\+CME ERROR: *(0-9)+", 5.0);  # warte 5s auf 'OK' oder 'ERROR' oder '+CME ERROR:<errorCode>

was mir allerdings nicht gefällt, weil, wenn im String keine korrekte regExp drin steht, dann meldet mir perl den Fehler an der Stelle, wo sie ausgewertet wird, also mitten in waitFor und nicht an der Stelle, wo waitFor aufgerufen wird. Ausserdem stinken mir die doppelten backslashes, wenn ich den + maskieren will.

Wie muss ich nun das Parameterauslesen in waitFor implementieren, damit es, so wie im ersten Code-Schnippsel angegeben, funktioniert?

Danke
J-jayz-Z
 2006-10-06 13:51
#70561 #70561
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Na ja, du kannst den regex mit qr übergeben:
Code: (dl )
waitFor(qr/OK|ERROR|\+CME ERROR: *(0-9)+/, 5.0);

Aus perldoc perlop:
Code: (dl )
1
2
3
4
5
6
 qr/STRING/imosx
This operator quotes (and possibly compiles) its STRING as a
regular expression. STRING is interpolated the same way as
PATTERN in "m/PATTERN/". If "'" is used as the delimiter, no
interpolation is done. Returns a Perl value which may be used
instead of the corresponding "/STRING/imosx" expression.
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
<< >> 2 Einträge, 1 Seite



View all threads created 2006-10-06 13:43.