Schrift
[thread]7007[/thread]

Interpolation in Regexp



<< >> 9 Einträge, 1 Seite
Matthias
 2005-05-20 18:01
#55083 #55083
User since
2005-04-22
18 Artikel
BenutzerIn
[default_avatar]
Hallo,

Beim Versuch, in Backticks eingeschlossene Strings zu analysieren, mag Perl den erkannten String nicht nochmal matchen.

Code (perl): (dl )
1
2
3
4
5
6
7
8
$TMP = "asdf";
$search = 'command';
$string = '`command -option $TMP`';
$string =~ /(`$search([^`]*)`)/ ;
$match = $1;

print "erkannter String: $match \n";
print (($string =~ m/($match)/ ) ?  "Regexp-Match: $1\n" : "kein Match\n");


gibt den erkannten String zwar richtig aus, liefert dann aber als Ergebnis "kein Match". Leider komme ich nicht darauf, was hier schiefgeht.

Grüße

Matthias
renee
 2005-05-20 18:26
#55084 #55084
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#! /usr/bin/perl

use strict;
use warnings;


my $TMP = "asdf";
my $search = 'command';
my $string = '`command -option $TMP`';
$string =~ /(`$search([^`]*)`)/;
my $match = $1;

print "erkannter String: $match ";
print (($string =~ m/(\Q$match\E)/ ) ? "Regexp-Match: $match " : "kein Match ");


Man beachte das \Q und das \E, was bewirkt, dass Sonderzeichen escaped werden...

Du solltest auch dringendst use strict; und use warnings; benutzen...
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/
renee
 2005-05-20 18:27
#55085 #55085
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Warum use strict?? Darum: http://wiki.perl-community.de/bin/view/Wissensbasis/UseStrict
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/
Matthias
 2005-05-20 18:37
#55086 #55086
User since
2005-04-22
18 Artikel
BenutzerIn
[default_avatar]
Ja, so funktioniert es. Danke!\n\n

<!--EDIT|Matthias|1116599917-->
Matthias
 2005-05-20 18:41
#55087 #55087
User since
2005-04-22
18 Artikel
BenutzerIn
[default_avatar]
Aber ganz verstanden habe ich noch nicht, warum hier das $ escaped werden muss. Versucht der Parser (ohne escaping), nicht nur $match, sondern auch noch $TMP zu interpolieren?
steffenw
 2005-05-21 19:19
#55088 #55088
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wenn in einem String Variablen vorkommen, hier im Beispiel Skalare (durch das vorangestellte Zeichen $markiert), dann werden die natürlich alle aufgelöst oder keine. Wenn man das nicht will, muß man es eben explizit angeben. Manchmal hat man auch Probleme damit, daß man Scalare auflösen möchte, sich aber der Name vom umgerenzenden Text nicht abhebt. Z.B. ist das bei "$scalar1text1$scalar2" der Fall. Das schreibt man dann so: "${scalar1}text1$scalar2". Willst Du, daß z.B. $scalar1 wie geschrieben im Text bleibt, schreibe "\$scalar1text1$scalar2". So wird nur $scalar2 aufgelöst. Um eben nicht immer alle diese Quotingzeichen, also das \ schreiben zu müssen, dafür hat man \Q......\E erfunden. Perl-Programme sollen ja auch nicht von \\\\\\ überhäuft werden, wie man das aus anderene Sprachen kennt, wo dann keiner mehr so richtig durchblickt. Kommen die Daten aus einer externen Quelle, dann weißt Du ja auch nicht, was alles zu quoten ist, dann ist das \Q......\E Konstrukt sehr hilfreich. Perl macht das dann schon richtig - Perl hilft Dir. Schaue Dir auch mal \L, \l, \U, \u, q() und qq() an, dann begreifst Du das alles recht gut. Du mußt Dir immer überlegen, welche Quotingoperatoren Variablen auflösen und welche nicht. Bei Deinem Beispiel ist die Schreibweise "asdf" zwar richtig, gereicht hätte hier aber auch 'asdf' oder q(adsf), weil es nichts aufzulösen gibt.\n\n

<!--EDIT|steffenw|1116689081-->
$SIG{USER} = sub {love 'Perl' or die};
Matthias
 2005-05-22 16:27
#55089 #55089
User since
2005-04-22
18 Artikel
BenutzerIn
[default_avatar]
@steffenw:

Ich hoffe, dass du dich etwas vertan hast, denn in meinem Beispiel führt die Interpolation von $match erst auf $TMP, und ich wüsste nicht, dass über mehrere Stufen interpoiert wird.

Kann das Problem evtl. daran liegen, dass das $ als Stringendezeichen verstanden wird, obwohl noch Zeichen danach folgen?
pKai
 2005-05-22 17:12
#55090 #55090
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
[quote=Matthias,22.May.2005, 14:27]Kann das Problem evtl. daran liegen, dass das $ als Stringendezeichen verstanden wird, obwohl noch Zeichen danach folgen?[/quote]
Ja.

Teil der Ausgabe mit use re 'debug'; für die Version ohne \Q:
Quote
Compiling REx ``command -option $TMP`'
size 10 first at 1
1: EXACT <`command -option >(7)
7: EOL(8)
8: EXACT <TMP`>(10)
10: END(0)
I sense a soul in search of answers.
steffenw
 2005-05-22 19:42
#55091 #55091
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
@Mathias ich hatte das mal ganz allgemein beschrieben, wie das mit dem Auflösen von Variablen ist und wie man die \Q usw. benutzt.
$SIG{USER} = sub {love 'Perl' or die};
<< >> 9 Einträge, 1 Seite



View all threads created 2005-05-20 18:01.