Schrift
[thread]8357[/thread]

RegEx-en und dann zu String evaluieren



<< |< 1 2 >| >> 14 Einträge, 2 Seiten
docsnyder
 2006-09-25 16:12
#70224 #70224
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi!

Gegeben ist folgende Funktionalität:

Code: (dl )
1
2
3
4
5
6
7
$a = "foo";

if ( $condition {
$a =~ s/foo/bar/;
}

print $a;


Ich möchte nun die gesamte Funktionalität in den print reinbasteln. Dabei muss ich aber erreichen, dass das Argument von print nach dem RegEx irgendwie zu dem ersetzten String evaluiert. Wenn ich es so mache:

Code: (dl )
print $condition ? $a=~s/foo/bar/ : $a;


evaluiert der Ausdruck

Code: (dl )
$a=~s/foo/bar/


zu 1 (Anzahl der Matches).

Daher habe ich versucht, $a in einem comma-separated-expression anzuhängen, denn so ein Ausdruck evaluiert ja immer zu dem Ausdruck nach dem letzten Komma:

Code: (dl )
print $condition ? $a=~s/foo/bar/, $a : $a;


Das geht aber auch nicht, weil das Komma dann als Argument-Separator des print-statements angesehen wird.

Hhhmmm?

Also habe ich versucht, den comma-separated-expression zu klammern:

Code: (dl )
print $condition ? ($a=~s/foo/bar/, $a) : $a;


... geht aber auch nicht, weil das dann eine Liste ist die wiederum im scalaren Kontext zur Anzahl der Elemente evaluiert.

Auch in einen Block {} kann ich den comma-separated-expression nicht kapseln, da

Code: (dl )
print $condition ? {$a=~s/foo/bar/, $a} : $a;


dann kein Block, sondern ein Hash ist.

Ich habe es jetzt so gelöst, daß ich mir ein anonymes Array bastele und sofort auf den ersten Index zugreife, um $a zu bekommen:

Code: (dl )
print $condition ? [ $a=~s/foo/bar/, $a ]->[1] : $a;


Mir erscheint das ziemlich umständlich. Kann mir jemand sagen, ob bzw. wie das anders (einfacher) geht?

Bin für jeden Hinweis dankbar.

Gruß, Doc
Ishka
 2006-09-25 16:27
#70225 #70225
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Mir fallen dazu spontan zwei Möglichkeiten ein:
Code: (dl )
print $condition ? ($a=~s/foo/bar/, $a)[1] : $a;

sowie
Code: (dl )
print $condition ? do{$a=~s/foo/bar/;$a} : $a;
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
sid burn
 2006-09-25 17:29
#70226 #70226
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Was soll den Ziel der ganzen Sache sein?
Möchtest du es lediglich in einer Zeile schreiben? Ansonsten würde ich das if einfach hinten anhängen.

Code: (dl )
1
2
my $string = 'foo';
print $string if $string =~ s/foo/bar/g;
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
renee
 2006-09-25 17:34
#70227 #70227
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das ist nicht das gleiche.

OP: Wenn eine Bedingung erfüllt ist, dann ersetze im String etwas und gebe den neuen String aus. Ansonsten den alten. Eine Ausgabe kommt also auf jeden Fall

Du: Mache eine Ausgabe, wenn etwas ersetzt wird. D.h. Es kommt nicht immer eine Ausgabe. Und Du überprüfst nicht, ob überhaupt ersetzt werden soll.
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/
bo
 2006-09-25 17:36
#70228 #70228
User since
2006-05-09
76 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
print $cond ? $a =~ s/foo/bar/ ? $a : $a : $a;
docsnyder
 2006-09-25 17:40
#70229 #70229
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@bo

Diese Variante finde ich bis jetzt am interessantesten!

Gruß, Doc
renee
 2006-09-25 17:52
#70230 #70230
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich persönlich finde es nicht so gut lesbar und etwas verwirrend (für den ersten Blick), da hinten nur noch $a auftaucht...

Mir persönlich gefällt die do-Block-Variante am besten (und die ist auch am schnellsten).

Aber es gilt TIMTOWTDI!
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/
Ronnie
 2006-09-25 18:39
#70231 #70231
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
($condition or $a =~ s/foo/bar/) and print $a;

EDIT: hab da glatt 'ne Negation vergessen:
Code: (dl )
(not $condition or $a =~ s/foo/bar/) and print $a;
\n\n

<!--EDIT|Ronnie|1159195638-->
pq
 2006-09-25 18:52
#70232 #70232
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=docsnyder,25.09.2006, 14:12]Also habe ich versucht, den comma-separated-expression zu klammern:

Code: (dl )
print $condition ? ($a=~s/foo/bar/, $a) : $a;


... geht aber auch nicht, weil das dann eine Liste ist die wiederum im scalaren Kontext zur Anzahl der Elemente evaluiert.[/quote]
stimmt nicht. es gibt keine liste im skalaren kontext. höchstens arrays
können im skalaren kontext sein.
außerdem ist diese liste ja argument von print und deswegen wird
"1bar" ausgegeben.

ich frage mich aber, warum du sowas brauchst. wenn es schon soviele
anläufe braucht, um es richtig hinzuschreiben, wird sich derjenige
freuen, der es mal lesen muss, wenn du schon längst nicht mehr
in der firma bist.\n\n

<!--EDIT|pq|1159196067-->
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
docsnyder
 2006-09-25 18:57
#70233 #70233
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@pq

Quote
stimmt nicht. es gibt keine liste im skaleren kontext. höchstens arrays
können im skaleren kontext sein.


Jedenfalls erschien in der Ausgabe "1" (nicht "1bar").

Quote
ich frage mich aber, warum du sowas brauchst. ...


Das Beispiel macht für sich gesehen nicht viel Sinn. Ich wollte grundsätzlich wissen, wie man dort, wo man durch einen RegEx ersetzt, direkt den ersetzten String weiterverwenden kann. Und da habe ich einfach ein möglichst simples beispiel gebastelt, das genau diesen Sachverhalt wiederspiegelt.

Gruß, Doc
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2006-09-25 16:12.