Schrift
[thread]7618[/thread]

$1 bei Regex (Seite 2)

Leser: 3


<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten
Strat
 2006-01-12 17:42
#61870 #61870
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=micross,12.01.2006, 16:09]hätte ich wohl dazu schreiben müssen. Wollte das Problem eigentlich nicht mit einer if-Abfrage lösen. Geht das nicht anders?[/quote]
$1 wird durch den nicht erfolgreichen match nicht geleert, sondern es bleibt der inhalt vom letzten erfolgreichen match drinnen stehen. also ist es noetig herauszufinden, ob der match erfolgreich war oder nicht, damit du weisst, ob du dich auf den Inhalt von $1 verlassen kannst oder nicht. Wie du das herausfindest, ob mit einem if oder unless oder ...?...:... oder or oder wasauchimmer, bleibt dir ueberlassen, z.B. ist manchmal das folgende konstrukt recht elegant:
Code: (dl )
1
2
3
4
foreach my $line (@lines) {
next unless $line =~ /^ein\s+(\b\S+\b)/;
print "Word ist: $1\n";
} # foreach


$& besser nicht benutzen, weil die sonst fuer jede regex gebildet werden, die im code vorkommt, und das macht das programm nur unnoetig langsam. genausowenig $` und $&´ usw.\n\n

<!--EDIT|Strat|1137080675-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Taulmarill
 2006-01-12 17:48
#61871 #61871
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
man könnte sich auch ein konstrukt wie regex ? $1 : "" überlegen, aber das sind im prinzip auch nur getarnte if-abfragen.

gibt es eigendlich einen grund für deine abneigung gegen das if?
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
micross
 2006-01-12 17:50
#61872 #61872
User since
2006-01-12
5 Artikel
BenutzerIn
[default_avatar]
Vergiss es Crian,

du verstehst nicht was ich meine!!
Der Korrektheit wegen: Mit dem Ton hast du angefangen!
^^ und "kein Kommentar" finde ich überflüssig in deinem Beitrag.
Ausserdem: Ich hoffe doch dass du auch zur Gattung Mensch gehörst und wir uns somit auf gleicher Höhe unterhalten egal ob du mehr Erfahrung hast oder nicht......

Also wenn dir meine Fragen nicht gefallen bitte ich dich auch nicht mehr darauf zu antworten! Wäre dir sehr verbunden!

Danke
rommi
bloonix
 2006-01-12 17:53
#61873 #61873
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=micross,12.01.2006, 16:09]Bei $1 aber ist das der Fall. Verstehst du was ich meine?[/quote]
Ja, deshalb musst du mit einer Bedingung arbeiten! Entweder
if oder unless, ansonsten erhälst du eine WARNING, wenn du
versuchst, auf ein leeres $1 zuzugreifen!

Strat's Beispiel mit next unless ist optimal. Allerdings nur, wenn
du bei nicht-match nichts tun möchtest.

Texte doch mal ein paar Beispiele, wie ^ein zeilen aussehen
können und jemand wird dir sicherlich eine optimale /regexp/
vorzeigen :-)\n\n

<!--EDIT|opi|1137081570-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Taulmarill
 2006-01-12 17:55
#61874 #61874
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
da hast du nicht ganz recht. Crian hat durch seine fragestellung den ansatz, eine entscheidung zu treffen (gebe ich $1 aus oder nicht) ohne die entscheidung treffen zu wollen (kein if benutzen) kritisiert. das hat er auf eine sarkastische weise getan, nichtsdestotrotz hat er nicht ganz unrecht.

die frage bleibt. warum willst du kein if benutzen? was genau willst du erreichen? ich denke die meisten aspekte deiner frage wurden beleuchtet.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Crian
 2006-01-12 17:56
#61875 #61875
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Vielleicht liest du meinen letzten Beitrag nochmal?

Mein Ton war der Weigerung, etwas Abfragen zu wollen, das man unterscheiden will schon angemessen *g

Mir ist es auch nicht wichtig, ob jemand mehr oder weniger Erfahrung hat, aber reinkommen und rumstänkern ist unfein. Ich glaub, du hast meine Antwort allerdings nur in den falschen Hals bekommen.
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
bloonix
 2006-01-12 17:57
#61876 #61876
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=micross,12.01.2006, 16:50]Vergiss es Crian,

du verstehst nicht was ich meine!![/quote]
Das ist aber nicht nett! Crian ist bemüht dir zu helfen und
das ist jede Menge Wert! Wenn du der Meinung bist, dass dich
jemand nicht versteht, dann solltest du dir die Mühe machen,
es genauer zu erklären.

Was hälst du davon? :)
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
esskar
 2006-01-12 18:44
#61877 #61877
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Ende der Diskussion! :)
micross
 2006-01-12 19:45
#61878 #61878
User since
2006-01-12
5 Artikel
BenutzerIn
[default_avatar]
@Crian
Du schreibst:
um dir die Unlogik aufzuzeigen...

Meine Antwort:
So unlogisch find ich es gar nicht ohne eine if-Abfrage arbeiten zu wollen
Das zeigt ja auch deine versteckte if-Abfrage :-)

my @data = qw/ei nur bein flur stein/;
for (@data) {
m~(ei)~ &&
print "$_ -> [$1]\n";
}

Siehst du da noch ein if geschrieben?

@Strat
Du schreibst:
$1 wird durch den nicht erfolgreichen match nicht geleert, sondern es bleibt der inhalt vom letzten erfolgreichen match drinnen stehen.

Mein Kommentar:
Genau das ist das Problem. Aber wie verhält sich denn dann $& ?

$& wird doch auch mit dem Treffer gefüllt wenn eine Übereinstimmung besteht! Aber es gibt auch nichts aus wenn es nichts gefunden hat! Auch nicht den Wert den es in einen vorherigen Match schon mal gespeichert hat.

Mein Fehler war wohl diese beiden Systemvariablen eins zu eins zu vergleichen. Die Beiden verhalten sich doch dann unterschiedlich da $1 wirklich dafür gedacht ist den Wert zu behalten. Die Lösung mit unless find ich dann auch recht elegant!


@Taulmarill
Du schreibst:
Crian hat durch seine fragestellung den ansatz, eine entscheidung zu treffen (gebe ich $1 aus oder nicht) ohne die entscheidung treffen zu wollen (kein if benutzen) kritisiert..

Meine Antwort:
Ich denke mit dem versteckten if hat Crian ja auch schon die Antwort auf meine ursprüngliche Frage gegeben. Es geht doch auch ohne if :-)

foreach(@Datei){m/^ein (\w+) / && print "$_ -> [$1]\n";}


Du schreibst:
ich würde den regex so schreiben: /^ein ([^ ]+)/

Meine Antwort:
Gefällt mir auch besser :-)
Auch die Variante von Strat /^ein\s+(\b\S+\b)/ is auch nicht schlecht.
Beim nächsten Reg wird alles besser :-)

Du schreibst:
die frage bleibt. warum willst du kein if benutzen? was genau willst du erreichen? ich denke die meisten aspekte deiner frage wurden beleuchtet

Meine Antwort:
Weiss auch nicht genau (bläht irgendwie den Text visuell auf). Finds
schöner wenn weninger Text da steht. Muss aber ja nicht gleich total reduziert
sein wie bei der Lösung von Crian m~(ein)~ , obwohl da könnte man sich schon daran gewöhnen!!!

Also erstmal vielen Dank an Alle
Gruss
rommi
Strat
 2006-01-12 22:09
#61879 #61879
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=micross,12.01.2006, 18:45]@Crian
Siehst du da noch ein if geschrieben?
[/quote]
scheint ein missverstaendnis zu sein, je nachdem, ob man nur den if-befehl oder (vielleicht etwas schlampig) if allgemeiner sieht (also auch unless, or, and, ...)

[quote=micross,12.01.2006, 18:45]@Crian
@Strat
Du schreibst:
$1 wird durch den nicht erfolgreichen match nicht geleert, sondern es bleibt der inhalt vom letzten erfolgreichen match drinnen stehen.

Mein Kommentar:
Genau das ist das Problem. Aber wie verhält sich denn dann $& ?

$& wird doch auch mit dem Treffer gefüllt wenn eine Übereinstimmung besteht! Aber es gibt auch nichts aus wenn es nichts gefunden hat! Auch nicht den Wert den es in einen vorherigen Match schon mal gespeichert hat.

Mein Fehler war wohl diese beiden Systemvariablen eins zu eins zu vergleichen. Die Beiden verhalten sich doch dann unterschiedlich da $1 wirklich dafür gedacht ist den Wert zu behalten.
[/quote]
$& ist eigentlich nur (noch?) in Perl, weil es sie auch in anderen sprachen gibt (z.B. sed); aber das bietet so viele performancenachteile, dass man es nicht verwenden sollte. Aber das wird fuer jede Regex gesetzt, waehrend $1, $2 usw. nur dann gesetzt werden, wenn die regex erfolgreich ist und was gecaptured wird.
$1, $2, $3 bis $9 sind recht nett, aber ohne ueberpruefung auf einen match meist wertlos. haeufig sieht man
Code: (dl )
1
2
3
if ($irgendwas =~ /(blabla)/) {
print "ok: $1\n";
}

wenn man mehr werte herausholen will, ist wohl der weg ueber das rueckgabearray der einfachste, z.B.
Code: (dl )
my ($val1, $val2, $val3) = $string =~ /(.)(.)(.)/;

wenn der match nicht erfolgreich ist, sind $val1-$val3 einfach leer.
(achtung: falle:
Code: (dl )
1
2
my $value = "abcde" =~ /(de)/;
print $value, "\n";

gibt vermutlich nicht das aus, was man auf den ersten blick erwartet; dafuer ist ein listenkontext besser:
Code: (dl )
1
2
my ($value) = "abcde" =~ /(de)/;
print $value, "\n";
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten



View all threads created 2006-01-12 16:04.