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

Regexp: Ersetzungsausdruck mitbenutzen (Seite 2)

Leser: 2


<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten
Linuxer
 2008-07-13 14:52
#112045 #112045
User since
2006-01-27
3891 Artikel
HausmeisterIn

user image
KurtZ+2008-07-13 04:22:55--
mann oh mannnnnnn ... lernt nie aus! das mit der linken seite war mir klar, aber rechts schockt mich mal wieder heftig:
Code (perl): (dl )
1
2
3
  
DB<1> ($x='abc')=~s/(\w)/.\1/g ; print $x
.a.b.c


Nur weil man etwas in Perl einsetzen kann, heisst das noch lange nicht, dass man das auch einsetzen muss!

Perl warnt Dich übrgens, wenn Du im Ersetzungsteil die Rückreferenz \x benutzt:

Code: (dl )
1
2
3
$ perl -w
($x='abc')=~s/(\w)/.\1/g ; print $x
\1 better written as $1 at - line 1.

meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
KurtZ
 2008-07-13 15:35
#112046 #112046
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Linuxer+2008-07-13 12:52:24--
Nur weil man etwas in Perl einsetzen kann, heisst das noch lange nicht, dass man das auch einsetzen muss!


Toll und wenn ich etwas escaped haben möchte haben, muss ich aus der Warning schlau werden... ich sehe keinen Mehrwert [*] aus diesen "Two Ways to Do It" wenn deswegen Heuristiken nötig sind. [quote="nepos+2008-07-13 10:37:43--"]Nein, ist es nicht. Es ist ganz normal, dass du mit \ Zeichen escapst bzw. mit \xxx Zeichencodes direkt angibst.[/quote] Eben und genau dabei sollte es möglichst bleiben. [*] wenn es einen gibt, bitte her damit. Laut perlre gehts um Kompatibilität zu sed.
TMTOWTDYOG (there's more than one way to dig your own grave)
betterworld
 2008-07-13 16:29
#112048 #112048
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
KurtZ+2008-07-13 04:22:55--
das ist bestimmt wieder eine diese "wir bleiben Rückwärtskompatibel zu Perl 0"-Fossilien, wie diese schrägen Sonderbedeutungen von .. und ... !

Hm? .. und ... sind doch cool, was hat denn das mit rückwärtskompatiblen Fossilien zu tun?
KurtZ
 2008-07-13 17:36
#112051 #112051
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
du benutzt .. in scalar context ???
TMTOWTDYOG (there's more than one way to dig your own grave)
betterworld
 2008-07-13 17:46
#112052 #112052
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
KurtZ+2008-07-13 15:36:55--
du benutzt .. in scalar context ???

Naja, es kommt selten vor, dass ich das brauche, aber dann ist es doch sehr praktisch. Besonders in Shell-Einzeilern kann es hilfreich sein.
KurtZ
 2008-07-13 18:18
#112053 #112053
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
ich gebe zu ich hätte es auch mal gebrauchen können, als ich einen Mailparser geschrieben habe (und CPAN noch nicht kannte). Aber ich habe die (imho verwirrende[*]) Doku dazu schon öfter ratlos durchgelesen, als dass ich Code damit hätte schreiben können. Ich weiß auch nicht ob der Code wartbarer wird, wenn man auf benannte Flags verzichtet. hmm ich probiers mal aus... NACHTRAG: [*] ich kapier jetzt auch erst so langsam dass man es nicht nur auf Zeilennummern anwenden kann.
TMTOWTDYOG (there's more than one way to dig your own grave)
KurtZ
 2008-07-14 00:12
#112066 #112066
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
KurtZ+2008-07-13 16:18:34--
NACHTRAG: [*] ich kapier jetzt auch erst so langsam dass man es nicht nur auf Zeilennummern anwenden kann.


In der Tat nützlich, wenn man Teilintervalle in Schleifen greifen möchte.
Die Perldoc dazu sieht eher nach Spezialistentum bei Textprocessing und Sed-Emulation aus, aber man kann es viel allgemeiner anwenden:

Ich hab gleichmal versucht es zu emulieren mit einer sub "episode"

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/perl
use Data::Dumper;

@in=qw( ich du er sie es wir ihr sie sonstwas);


$\="\t";
print;
for (@in,@in) {
        print;
        print "1: $_" if /wir/ .. /sie/;
        print "2: $_" if ($_ eq "wir") .. ($_ eq "sie");
        print "3: $_" if episode ( ($_ eq "wir") , ($_ eq "sie") , "plural3" );
        print "4: $_" if episode ( scalar(/wir/) , scalar(/sie/), "plural4" );
#       print "5: $_" if episode ( /wir/ , /sie/, "plural5" );
        print "\n";
}


{ my %flipflop; 
  sub episode ($$$) {
          my ($start,$end,$label)=@_;
#         print Dumper \@_ if @_ != 3;

          $flipflop{$label}=1 if $start;
          my $return=$flipflop{$label};
          $flipflop{$label}=0 if $end;

          return $return;
  }
}

__END__

        ich     
        du      
        er      
        sie     
        es      
        wir     1: wir  2: wir  3: wir  4: wir  
        ihr     1: ihr  2: ihr  3: ihr  4: ihr  
        sie     1: sie  2: sie  3: sie  4: sie  
        sonstwas        
        ich     
        du      
        er      
        sie     
        es      
        wir     1: wir  2: wir  3: wir  4: wir  
        ihr     1: ihr  2: ihr  3: ihr  4: ihr  
        sie     1: sie  2: sie  3: sie  4: sie  
        sonstwas        


Beispiel 5 funktioniert nicht wie gewollt, weil m// im Listenkontext evaluiert wird. Ich muss umständlich Skalarenkontext erzwingen, da hilft leider auch kein Protyping.

Hat jmd vielleicht ne gute Idee?
TMTOWTDYOG (there's more than one way to dig your own grave)
KurtZ
 2008-07-14 00:32
#112067 #112067
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
naja ... man könnte auch einen String erzwingen
Code (perl): (dl )
        print "6: $_" if episode ( ""+/wir/ , ""+/sie/, "plural6" );
TMTOWTDYOG (there's more than one way to dig your own grave)
Gast Gast
 2008-07-14 01:03
#112068 #112068
Man kann das auch mit Prototypen machen :)
Code: (dl )
sub episode ($$$)

Dann wird skalarer Kontext erzwungen.

Und es geht sogar strict und warnings konform und ohne den 3. Parameter:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
sub episode ($$)
{
my( $start, $end ) = @_;

my $flipflop if 0;
($flipflop = 0) unless $flipflop;

($flipflop = 1) if $start;
my $return = $flipflop;
($flipflop = 0) if $end;

return $return;
} # episode

MfG
R-o-l-f
 2008-07-14 01:07
#112069 #112069
User since
2008-07-09
4 Artikel
BenutzerIn
[default_avatar]
KurtZ+2008-07-13 22:12:15--
Hat jmd vielleicht ne gute Idee?


Hmm, doppelte Verneinung ?
Code (perl): (dl )
print "6: $_" if episode ( !! /wir/ , !! /sie/, "plural6" );


ansonsten könntest du beim prototyping scalar oder array fordern, und in der sub checken obs ein array ist udn obs leer ist, dann könntest du auch
Code (perl): (dl )
print "6: $_" if episode (  /wir/ ,  /sie/, "plural6" );

schreiben können.

Das du ein Label angeben musst ist eher hässlich, aber ich weiß nicht wie man sich sowas ersparen könnte.


@Gast: Hat er das nicht versucht?
<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten



View all threads created 2008-07-12 21:22.