Schrift
[thread]7618[/thread]

$1 bei Regex

Leser: 3


<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten
Gast Gast
 2006-01-12 16:04
#61860 #61860
Hallo zusammen,

möchte aus einer Datei immer das zweite Wort einer Zeile ausgeben wenn die Zeile mit dem Wort "ein" anfängt.
Mit dem nachstehenden Code lasse ich mir das gefundene Wort ausgeben. Leider gibt $1 auch einen Wert aus obwohl die Zeile nicht mit "ein" anfängt und zwar den Wert den $1 als letztes erfolreich gefunden hat. Wie kann ich das verhindern, schliesslich soll $1 keinen Wert enthalten wenn die Zeile nicht mit "ein" anfängt.

Bei $& funktioniert es dass nur der Wert der gefunden wurde ausgegeben wird, und wenn "nichts" gefunden wird dann wird auch nichts ausgegeben.

foreach(@quelldatei)
{
$_ =~ /^ein (\w+) /;
$zweites = $1;
print "\n$zweites";
}

Danke im vorraus
rommi
bloonix
 2006-01-12 16:24
#61861 #61861
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Code: (dl )
1
2
3
4
5
6
7
foreach (@quelldatei) {
  if (/^ein (.+?) /) {
     # mach was mit $1
  } else {
     # oder auch nicht
  }
}
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.
micross
 2006-01-12 17:09
#61862 #61862
User since
2006-01-12
5 Artikel
BenutzerIn
[default_avatar]
Hallo opi,

hätte ich wohl dazu schreiben müssen. Wollte das Problem eigentlich nicht mit einer if-Abfrage lösen. Geht das nicht anders?
Wenn ich in der Regex $& benutze wird doch auch nicht der zu letzt gespeicherte Inhalt von $& ausgegeben wenn kein Treffer gefunden wurde?!! Bei $1 aber ist das der Fall. Verstehst du was ich meine?

Gruss
rommi
Crian
 2006-01-12 17:15
#61863 #61863
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Du hast das Problem, dass manchmal ein Ereignis eintritt und manchmal nicht. Du möchtest unterschiedlich darauf reagieren, aber nicht abfragen, ob es aufgetreten ist. Hmm. Kein Kommentar ^^
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
Taulmarill
 2006-01-12 17:20
#61864 #61864
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
meinst du so?
Code: (dl )
1
2
3
my $foo = 'ein maennlein steht im walde ...';
print( $foo =~ /^ein (.+?) / );
print "\n";

imho ist aber die variante mit if sauberer. wenn dir die blockschreibweise zu viel platz wegnimmt, kannst du das if auch hinten anstellen, etwa so:
Code: (dl )
print $1 if /^ein (.+?) /;
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Taulmarill
 2006-01-12 17:22
#61865 #61865
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
nachtrag:
ich würde den regex so schreiben: /^ein ([^ ]+)/
TIMTOWTDI, aber ich find's schöner...
$_=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:27
#61866 #61866
User since
2006-01-12
5 Artikel
BenutzerIn
[default_avatar]
Hallo Crian,

verstehe deine Antwort nicht??? Ersetzte doch einfach mal $1 mit $&. Was erhälst du denn dann als Ausgabe????

Ausgabe: wenn Treffer dann ausgeben, wenn kein Treffer dann
nichts ausgeben!

Und genau darauf zielt meine Frage, warum das eigentlich bei der Sondervariable $1 nicht so ist und ob es da nicht noch was anderes gibt ausser es über eine IF-Abfrage zu machen!!!!

Wo ist jetzt dann dein Problem die Frage zu verstehen. Sag doch einfach dass es nichts gibt und es nur mit einer IF-Abfrage zu bewerkstelligen ist und spar dir dein ^^

Danke und Gruss
rommi
micross
 2006-01-12 17:36
#61867 #61867
User since
2006-01-12
5 Artikel
BenutzerIn
[default_avatar]
Hallo Taulmarill,

ich meine warum folgendes nicht geht:

foreach(@quelledatei)
{$_ =~ /^ein (\w+) /;print "\n$1"}

das ist doch die kürzeste Schreibweise, ohne if-Abfrage. Leider
gibt mir $1 auch ohne einen Treffer etwas aus. Und das soll natürlich nicht sein.

Komischerweise funktioniert es mit $& ohne Probleme das nur dann etwas ausgegeben wird wenn auch was gefunden wurde.

foreach(@quelledatei)
{$_ =~ /^ein (\w+) /;print "\n$&"}

Hoffe ich habs jetzt einigermassen erklärt was ich meine.
Natürlich funzt es mit der If-Abfrage aber die gefällt mir halt nit so jut...

Also wenn keine Alternative gibt dann bitte Bescheid sagen!!

Danke und Gruss
rommi
Crian
 2006-01-12 17:36
#61868 #61868
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=micross,12.01.2006, 16:27]Ausgabe: wenn Treffer dann ausgeben, wenn kein Treffer dann
nichts ausgeben![/quote]
Ja, aber da steckt doch ein if drin?

Mäßige deinen Ton. Im zweiten Beitrag gleich regulars anzumachen ist kein guter Stil...

Mein Beitrag sollte dein Problem von einer etwas höheren Warte beleuchten, um dir die Unlogik aufzuzeigen.

Zu deinem "Problem": $1 wird gesetzt, wenn etwas gefangen wird. Wenn nichts gefangen wird, behält es den alten Inhalt.

Code: (dl )
1
2
3
4
5
my @data = qw/ei nur bein flur stein/;
for (@data) {
m~(ei)~;
print "$_ -> [$1]\n";
}


Ausgabe:
Code: (dl )
1
2
3
4
5
ei -> [ei]
nur -> [ei]
bein -> [ei]
flur -> [ei]
stein -> [ei]



Eine Möglichkeit mit verstecktem if:

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


Ausgabe:
Code: (dl )
1
2
3
ei -> [ei]
bein -> [ei]
stein -> [ei]
\n\n

<!--EDIT|Crian|1137080693-->
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
Taulmarill
 2006-01-12 17:41
#61869 #61869
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
@micross: schau dir mein erstes codebeispiel noch einmal an. wo ist da das if?
dass dein ansatz nicht funktioniert liegt einfach daran, dass $1 nicht gefüllt wird, wenn der regex nicht matcht. aber das hast du ja schon selbst herausgefunden. eine perlinterne variable die den von dir gewünschten inhalt hat gibt es afaik nicht.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten



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