Anzahl und Reihenfolge in perl regex

Dieses Thema im Forum "Ruby, php, Perl, Python ..." wurde erstellt von hwj, 01.12.2006.

  1. hwj

    hwj Doppel-As

    Dabei seit:
    23.06.2006
    Beiträge:
    131
    Zustimmungen:
    0
    Ort:
    Bei Buxtehude
    ... oder auch die Denksportaufgabe für's Wochenende :devil:

    Guten Morgen !

    Ich versuche mich gerade an einem Suchen/Ersetzen Ausdruck in perl und frage mich gerade, ob das mit regex überhaupt noch geht ... also, ich würde gerne einen String mit "Attribut=Wert" ersetzen, aber jedes Attribut darf nur max. 1x vorkommen, aber die Reihenfolge soll egal sein. Klingt einfach, aber geht das ?

    Beispiel:

    ok: Red=123 green=34 blue=45
    ok: green=56 Red=123
    ok: blue=5

    nicht ok (2x red): red=4 blue=5 red=5

    sicher könnte man schreiben:
    Code:
    sub mymatch {
    my $str = shift;
    
    if   ($str =~ /(red=\d+)? (green=\d+)? (blue=\d+)?/) {
      ...
    } elsif ($str =~ /(red=\d+)? (blue=\d+)? (green=\d+)?/) {
      ...
    } elsif ($str =~ /(green=\d+)? (blue=\d+)? (red=\d+)?/) {
     ...
    
    und so alle Kombinationen abklappern, aber nicht gerade elegant. Und wenn dann noch eine weitere Farbe (bzw. Attribut) hinzukommt ...

    Eine andere Möglichkeit wäre natürlich, die Regex im Programm als String selbst zu erzeugen und dann evtl. eval zu arbeiten, oder ?

    Geht das einfacher ?

    Gruss
    Heiko
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 angelsfall, 03.12.2006
    Zuletzt bearbeitet: 03.12.2006
    angelsfall

    angelsfall Routinier

    Dabei seit:
    09.05.2005
    Beiträge:
    315
    Zustimmungen:
    0
    Ort:
    Berlin
    hi, mir ist nicht ganz klar, was du machen willst, da du zu wenig informationen gegeben hast. so wie es sich anhört, könnte man das problem auch ganz anders lösen, oder sollen es explizit regex sein? wo z.b. kriegst du die informationen her, welche farbe wie geändert werden soll?

    ich hätte da einen anderen lösungsansatz, der mir aber auch noch nich so gefällt ;) aber das übt schließlich.
    ich bin davon ausgegangen, dass du nen hash hast, in dem die benötigten informationen stehen:

    Code:
    #!/usr/bin/perl -wl
    
    use strict;
    use warnings;
    
    # your string with color information
    my $str = "red=100 green=200 blue=300";
    
    # hash with replace content
    my %ch = ( 
      'red' => 210,
      'blue' => 400,
    );
    
    # turn str into hash
    my %hash = map { split "=", $_ } split " ", $str;
    
    # merge hashes. this updates the values or add new key-value if key doesnt exists
    %hash = (%hash, %ch);
    
    # join hash to string again
    $str = join " ", map { $_ . "=" . $hash{$_} } keys %hash;
    
    print $str;
    
    wenn ich dich falsch verstanden habe, tut mir das leid. vielleicht hilfts aber :)

    /edit: schwere fehler im code behoben ;) jaja, es ist spät. und mir ist auch bewusst, das die werte fuer die farben nur bis 255 gehen :)
     
  4. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Man könnte mit

    Code:
    @red = (/(red=\d+/g));
    $c_red = $#red+1;
    ...
    
    das Vorkommen zählen und dann auf kleinergleich 1 testen.

    Gruss, Xanti
     
  5. hwj

    hwj Doppel-As

    Dabei seit:
    23.06.2006
    Beiträge:
    131
    Zustimmungen:
    0
    Ort:
    Bei Buxtehude
    Hallo Ihr beiden,

    danke für die Tipps. Eine regex ist mir auch über das Wochenende nicht eingefallen. In der Eingabedatei stehen mehrere Zeilen mit "red .. green .. blue" - und eine "gedachte" Ausgabe wäre z.B. eine Komma-separierte Liste aller Farbwerte ( "-" für nicht angegeben).

    Ich denke, ich mach' das doch Zeilenweise "zu Fuß" - ist unterm Strich auch nach einfacher, wenn man später den Code noch mal ändern muß.

    Heiko
     
  6. szk

    szk Grünschnabel

    Dabei seit:
    09.12.2006
    Beiträge:
    6
    Zustimmungen:
    0
    Vorschlag:

    Code:
    sub mymatch {
    my $str = shift;
    
    if   ($str !~ /(\w+=).*(\1)/)  # Doppelte verbieten
    {
      if (%_ = ($str =~ /(\w)=(\d+)/g)) # Attribut=Wert - Liste erstellen
      {
    
        # Hash %_ irgendwie verarbeiten:
    
        foreach $key (sort keys %_)
        {
           print "$key=".$_{$key}."\n";
           #...
        };
      };
    } else {
      # Attribut doppelt
    }; 
    
    }
    
    
     
  7. hwj

    hwj Doppel-As

    Dabei seit:
    23.06.2006
    Beiträge:
    131
    Zustimmungen:
    0
    Ort:
    Bei Buxtehude
    Hallo Sebastian,

    ja, so in der Art habe ich das jetzt auch am laufen. Doch was ist das:
    Code:
    if (%_ = ($str =~ /(\w)=(\d+)/g))
    Cool, man lernt ja nie aus - aus einem Match direkt in einen Hash, ist ja nicht wahr. und dann noch in einer if-Abfrage ... wird wohl Zeit mir mal wieder ein neues Perl-Handbuch zu kaufen :-)

    Danke
    Heiko
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

Anzahl und Reihenfolge in perl regex

Die Seite wird geladen...

Anzahl und Reihenfolge in perl regex - Ähnliche Themen

  1. Steam: Anzahl an Linux-Spielen vervierfacht sich

    Steam: Anzahl an Linux-Spielen vervierfacht sich: Seit der Veröffentlichung von Steam für Linux vor einem Jahr hat sich die Zahl der Titel für Linux vervierfacht. Auch die Qualität der Titel...
  2. Anzahl Blöcke Unix-Dateisystem berechnen

    Anzahl Blöcke Unix-Dateisystem berechnen: Hi, Ich möchte folgende Aufgabe berechnen: Die Blockgröße eines Unix-Dateisystems beträgt 4 kiByte. Die indirekten Blöcke enthalten 1024...
  3. Anzahl Dateein in xbeliebigen Verzeichnissen ermitteln

    Anzahl Dateein in xbeliebigen Verzeichnissen ermitteln: Hallo ixh habs mal in diese Rubrik gesetzt, da ich nciht weiß, ob das nur per script geht, oder nicht. Wie kann ich die Anzahl der Dateien...
  4. Anzahl Elemente in Array hochzählen

    Anzahl Elemente in Array hochzählen: Hallo zusammen, nach etwa 20 Stunden unermüdlichen Probierens, komme ich jetzt doch nicht am Nachfragen vorbei :-( Ich möchte ein Array von...
  5. Anzahl der belegten Speicherbänke in der Konsole anzeigen

    Anzahl der belegten Speicherbänke in der Konsole anzeigen: Moin, gibt es eine Möglichkeit über die Konsole herauszufinden, wie viele RAM Module in meinem System verbaut sind? mfg thobit