Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]5733[/thread]

Frage zu Backreferences



<< |< 1 2 >| >> 14 Einträge, 2 Seiten
DemoFreak
 2003-09-17 21:12
#53440 #53440
User since
2003-09-06
54 Artikel
BenutzerIn
[default_avatar]
Moin,

laut perlre sind die Variablen $1 ff. im gleichen Block definiert:

Quote
The numbered variables ($1, $2, $3, etc.) and the related punctuation set ($+, $&, $`, and $') are all dynamically scoped until the end of the enclosing block or until the next successful match, whichever comes first. See "Compound Statements" in perlsyn.)


Gibt es eine Methode, wie ich erkennen kann, ob die Variable als Ergebnis der letzten Regex oder eben schon weiter oben gesetzt wurde? Oder muss ich dazu alle Regex in eigene Blöcke packen? Ich will erreichen, dass ich mit einer Bedingung wie etwa

Code (perl): (dl )
die "Nix gefunden!" if not defined $_systemvariable_die_ich_nicht_kenne;


entsprechend reagieren kann, ohne dass ich erst jede meiner vielen Regexe in einen eigenen Block packen muss, was IMHO die Lesbarkeit nicht eben fördert.\n\n

<!--EDIT|DemoFreak|1063819013-->
Gruss, Hannes
eisbeer
 2003-09-17 21:21
#53441 #53441
User since
2003-08-29
347 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich verstehe nich ganz, aber wenn ichs versuche ;) dann denk ich mir das :

Code: (dl )
1
2
3
4
5
$string = 'Hallo wie gehts ?';
if ($string=~/^(\w) /i) {
$match = $1;
print $match;
}


Oder meinst du was anderes ??
Die meisten PC Probleme befinden sich zwischen Bildschirm und Stuhl...
DemoFreak
 2003-09-17 23:46
#53442 #53442
User since
2003-09-06
54 Artikel
BenutzerIn
[default_avatar]
Ich bin ein Schaf. Määäh. :)

Der Ausdruck ($string=~/^(\w) /i) gibt also die Anzahl gefundender Backreferenzen zurück? Oder versteh ich das jetzt verkehrt?
Gruss, Hannes
jan
 2003-09-17 23:53
#53443 #53443
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
nein, der ausdruck gibt true zurück, wenn der regexp matcht, wodurch gleichzeitig eine backref gesetzt wird.
format_c
 2003-09-17 23:57
#53444 #53444
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Nicht ganz. Die Anzahl der Treffer eher. Noch genauer gesagt bekommst du die Anzahl nur im skalaren Kontext.

Diese Eigenschaft wird auch gern für boolsche Bedingungen verwendet.
unless ($string =~ /(wort)/g)...
das passiert jedoch nur wenn das Pattern captured.
Ist das nich der Fall gibt diese Anweisung ein boolsches true oder false zurück.
Du kannst auch alle Capturings der Treffer ( in ()) in einer Variable speichern:
Code (perl): (dl )
my @words = $string =~ /\b(\w+)\b/;

Jetzt ist jedes Element des Arrays words ein Wort aus string.

Um den Zauber mal aus dem Begriff "Backreference" zu nehmen überlegen wir mal was nochmal Beckreferences sind.

Meines Wissens so etwas
Code (perl): (dl )
$string =~ /(zeichenkette) \1/;

Dort ent hält die \1 innerhalb der RegEx den Wert der eigendlich in $1 landen würde.
Damit kann man zum beispiel, zwar etwas rudimentär aber veranschaulicht, doppelte Wörter aus einem Satz filtern:
Code: (dl )
1
2
3
4
my $string = "das das ist mein mein teststring";

$string =~ s/\b(\w+)\b \1/$1/g;
print $string;


Was du jetzt jedoch mit deiner Fragestellung bezwecken wolltest, kann ich immer noch nicht nachvollziehen.
Lass doch mal die Katze aus dem Sack und gib mal ein paar Fallbeispiele wenn man es nicht so gut erklären kann.
*jetztbistduamzug*

Gruß Alex\n\n

<!--EDIT|format_c|1063830901-->
DemoFreak
 2003-09-18 01:00
#53445 #53445
User since
2003-09-06
54 Artikel
BenutzerIn
[default_avatar]
Nee, klar, das gibt zurück, ob überhaupt was gefunden wurde oder nicht. Genau das hab ich gesucht, und es ist so offensichtlich...
Mannomann, manchmal hab ich echt nen Brett vor'm Schädel. Danke. :)

Zur kurzen Erläuterung: ich will in einem dynamisch erzeugten HTML-File, welches ich mir von einem Server hole, ein paar Werte nacheinander auslesen, und nicht jedesmal sind auch wirklich alle Werte drin. Daher schaue ich nacheinander meine Werte durch und speichere $1 je in einer Variablen. Und da hatte ich das Problem, dass ich nicht unterscheiden konnte, ob $1 nun im letzten oder schon einem der vorigen Regexe gesetzt wurde. Hab erst versucht, $1 zwischendrin auf UNDEf zu setzen, aber das geht (logischerweise) auch nicht.

Naja, wie gesagt, danke. Ist sooo einfach und manchmal doch so schwer. *g
Gruss, Hannes
pq
 2003-09-18 17:41
#53446 #53446
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=format_c,17.09.2003, 21:57]Nicht ganz. Die Anzahl der Treffer eher. Noch genauer gesagt bekommst du die Anzahl nur im skalaren Kontext.[/quote]
nein, es gibt 1 (bzw. 'true' ) bei einem (oder mehreren) treffern und im skalaren
kontext zurück, "" (bzw 'false' ) bei keinem treffer.
im listen-kontext werden die treffer zurückgeliefert.
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
format_c
 2003-09-18 18:03
#53447 #53447
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Stimmt. hab wohl etwas weiter gedacht als ich geschrieben hatte.
Gruß Alex
Crian
 2003-09-18 19:11
#53448 #53448
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Aber natürlich kannst Du auch $1, ... abfragen. Genau wie es in Deinem Zitat steht werden sie bei der nächsten RE zunächst alle undef und dann ggf. mit neuen Werten belget. Außerdem gelten sie natürlich nur in dem sie umgebenden Block.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
pq
 2003-09-18 19:20
#53449 #53449
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Crian,18.09.2003, 17:11]Aber natürlich kannst Du auch $1, ... abfragen. Genau wie es in Deinem Zitat steht werden sie bei der nächsten RE zunächst alle undef und dann ggf. mit neuen Werten belget.[/quote]
nein, sie werden nicht undef:
Code: (dl )
1
2
3
4
5
6
7
8
9
$ perl -wle' 
$_ = "text";
m/(t)/;
print "\$1: ($1)";
m/(T)/;
print "\$1: ($1)";'
$1: (t)
$1: (t)
$

Quote
Außerdem gelten sie natürlich nur in dem sie umgebenden Block.

jo. =)
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
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2003-09-17 21:12.