Peter Stock: erster Buchstabe groß

Hallo,

ich suche nach einer Möglichkeit, immer den ersten Buchstaben jedes Wortes durch einen Großbuchstaben zu ersetzen. Habe dazu bisher leider nichts finden können.

$text = "BLA_BLA_BLA_BLA";
$text = lc($text);

ergibt zunächst "bla_bla_bla_bla", ok

versucht habe ich folgendes:

$text =~ s/([^a-z]?)([a-z]?)/$1...../;
              ^^^     ^^^    ^^   ^^
               a       b      c    d

a) NICHT-Buchstabe finden.
b) Buchstabe finden.
c) NICHT-Buchstabe einsetzen.
d) Buchstabe einsetzen (hier weiß ich auch nicht, welcher Schalter das groß macht)

Ich habe es auch nach dem Beispiel in SelfHtml mit Transliteration probiert, aber da kommt nur Müll raus.

Kann mir da jemand helfen?

Danke!

Peter

  1. Hallo

    Hallo,

    ich suche nach einer Möglichkeit, immer den ersten Buchstaben jedes Wortes durch einen Großbuchstaben zu ersetzen. Habe dazu bisher leider nichts finden können.

    $text = "BLA_BLA_BLA_BLA";
    $text = lc($text);

    [s/// und RX]

    Kann mir da jemand helfen?

    I hope so. :)

    Es gibt die Funktion ucfirst() (perldoc -f ucfirst), die genau dafür gedacht ist. Vermutlich möchtest Du aber vorher die einzelnen Worte aus Deiner Zeichenkette extrahieren, indem Du diese evtl. an [^a-zA-ZäöüÄÖÜ]+ split()test (perldoc -f split).

    Imho etwas umständlich und ins Blaue hineingedacht wäre folgender Einzeiler:

    print join '', map { ucfirst } split /([^a-zA-ZäöüÄÖÜß]+)/, lc 'BLA_BLA_BLA_BLA';

    Wenn die Worte mit Umlauten beginnen, musst Du evtl. mit "use locale;" arbeiten und den lokalen Zeichensatz umschalten (perldoc perllocale).

    Gruß Alex
    --
    http://www.google.de/search?hl=de&safe=off&q=Rechtschreibung+Standart

  2. use Mosche;

    ich suche nach einer Möglichkeit, immer den ersten Buchstaben jedes Wortes durch einen Großbuchstaben zu ersetzen. Habe dazu bisher leider nichts finden können.

    $text = "BLA_BLA_BLA_BLA";
    $text = lc($text);

    ergibt zunächst "bla_bla_bla_bla", ok

    versucht habe ich folgendes:

    $text =~ s/([^a-z]?)([a-z]?)/$1...../;
                  ^^^     ^^^    ^^   ^^
                   a       b      c    d

    a) NICHT-Buchstabe finden.
    b) Buchstabe finden.
    c) NICHT-Buchstabe einsetzen.
    d) Buchstabe einsetzen (hier weiß ich auch nicht, welcher Schalter das groß macht)

    $text =~ s/([a-z])/uc($1)/e;

    das e bedeutet eval (oder irgendwas ähnliches...) und heisst, dass im Regex enthaltene Funktionen afgerufen werden. Hier rufst du die Funktion uppercase (uc) auf. Eigentlich selbsterklärend.

    Es gibt _sicherlich_ eine schönere Variante...

    use Tschoe qw(Matti);

    1. Hallo Matti,

      ich suche nach einer Möglichkeit, immer den ersten Buchstaben jedes Wortes durch einen Großbuchstaben zu ersetzen. Habe dazu bisher leider nichts finden können.

      $text =~ s/([a-z])/uc($1)/e;

      [Erläuterung]

      So findest Du aber nur den ersten Buchstaben in $text. Eine Möglichkeit mit RX und s/// zu arbeiten habe ich eben mal getestet:

      $test =~ s/\b([a-zA-ZäöüÄÖÜß])/\u$1/g; # einmal /e gespart.

      Das hat aber den Nachteil, daß \b zwischen \W und \w trifft, was Zahlen und _ ausnimmt, bzw. beinhaltet, je nachdem wie man es sieht. :)

      'bla-bla-bla-bla' würde somit zu 'Bla-Bla-Bla-Bla'.

      Bestimmt gibt es auch noch weitere Varianten. :)

      Gruß Alex
      --
      http://www.google.de/search?hl=de&safe=off&q=Rechtschreibung+Standart

      1. Hallo,

        danke Ihr beiden!
        Ich habe mich schon für total doof gehalten, aber so einfach war es ja dann doch nicht.
        Aus der Kombination Eurer Antworten, habe ist das Rätsel doch noch gelöst!
        Das angesprochene Problem, daß bei Zahlen und "_" auftritt, habe ich "elegant" gelöst, indem ich die Teile erst mit Pipes einklammere und diese später wieder entferne.

        Zum Dank, hier das Ergebnis meiner "Arbeit", vielleicht kann man es ja mal gebrauchen?! :-)

        #!/usr/bin/perl

        use  MP3::Info;
        use locale;

        system ("find -iname \*.mp3 > /tmp/mp3.rename");

        open (in,"/tmp/mp3.rename");
        while ($line = <in>)
                {
                        $line =~ s/\n//;
                        $mp3_info = get_mp3tag ($line);
                        $artist = $mp3_info->{ARTIST};
                        $album  = $mp3_info->{ALBUM};
                        $title  = $mp3_info->{TITLE};
                        $track  = $mp3_info->{TRACKNUM};

        $artist =~ s/_/ /g;
                        $album  =~ s/_/ /g;
                        $title  =~ s/_/ /g;

        $artist =~ s///-/g;
                        $album  =~ s///-/g;
                        $title  =~ s///-/g;

        $artist =~ s/([0-9])/|$1|/g;
                        $album  =~ s/([0-9])/|$1|/g;
                        $title  =~ s/([0-9])/|$1|/g;

        $artist =~ s/-/|-|/g;
                        $album  =~ s/-/|-|/g;
                        $title  =~ s/-/|-|/g;

        $artist = lc($artist);
                        $album  = lc($album);
                        $title  = lc($title);

        $artist =~ s/\b([a-zA-ZäöüÄÖÜß])/\u$1/g;
                        $album  =~ s/\b([a-zA-ZäöüÄÖÜß])/\u$1/g;
                        $title  =~ s/\b([a-zA-ZäöüÄÖÜß])/\u$1/g;

        $artist =~ s/ /_/g;
                        $album  =~ s/ /_/g;
                        $title  =~ s/ /_/g;

        $artist =~ s/|//g;
                        $album  =~ s/|//g;
                        $title  =~ s/|//g;

        if (length($track) < 2)
                                {
                                        $track = "0".$track;
                                }

        $artist =~ tr/-,.öäüßÖÄÜ&()A-Za-z_0-9/_/c;
                        $album  =~ tr/-,.öäüßÖÄÜ&()A-Za-z_0-9/_/c;
                        $title  =~ tr/-,.öäüßÖÄÜ&()A-Za-z_0-9/_/c;
                        $track  =~ tr/0-9//c;

        if (length($track) != 2)
                                {
                                        $track = '';
                                }

        $artist =~ s/__/_/g;
                        $album  =~ s/__/_/g;
                        $title  =~ s/__/_/g;

        if ($artist and $album and $title and $track)
                                {
                                        system ("mkdir -p "/home2/neu/$artist/$album"");
                                        system ("cp "$line" "/home2/neu/$artist/$album/$track-$title.mp3"");
                                }
                }
        close in;

        Peter
        , der eigentlich Paul heißt... hatte mich wegen der Frage sooo geschämt.

        1. Hi Peter/Paul ;-),

          $artist =~ s/_/ /g;
                          $album  =~ s/_/ /g;
                          $title  =~ s/_/ /g;

          $artist =~ s///-/g;
                          $album  =~ s///-/g;
                          $title  =~ s///-/g;

          $artist =~ s/([0-9])/|$1|/g;
                          $album  =~ s/([0-9])/|$1|/g;
                          $title  =~ s/([0-9])/|$1|/g;

          ... was hältst Du von einer Funktion "cleanup_string()" und vielen [1] Aufrufen derselben?

          Das würde sowohl die Übersichtlichkeit erhöhen als auch die Code-Menge reduzieren.

          Viel Grüße
               Michael

          [1] Informatiker-Zählweise: "Eins, zwei, viele".

          1. Hallo Micha,

            ... was hältst Du von einer Funktion "cleanup_string()" und vielen [1] Aufrufen derselben?

            Das würde sowohl die Übersichtlichkeit erhöhen als auch die Code-Menge reduzieren.

            Viel Grüße
                 Michael

            [1] Informatiker-Zählweise: "Eins, zwei, viele".

            ja, das ganze ist nur eine Teilfunktion, einer Sache, die etwas größer wird. Mehr "will" ich dazu nicht sagen.
            Ich programmiere immer in diesem etwas wilden Style, also erst rumprobieren, was passiert eigentlich, wenn... später werden die Dinge bereinigt.
            Viel eher wäre mir auch anzulasten, daß ich kein "strict" benutze, oder?

            Paul,
            die eigentlich Mary heißt, aber als Frau sich immer so untergebuttert fühlt.

            1. Mallo PPM,

              Ich programmiere immer in diesem etwas wilden Style, also erst
              rumprobieren, was passiert eigentlich, wenn... später werden die
              Dinge bereinigt.

              schon während der Rumprobierphase hilft Dir ein übersichtlicher Quelltext, potentielle Fehlerursachen zu eliminieren.

              Je einfacher und übersichtlicher Dein Quelltext ist, desto leichter verstehst Du selbst ihn - und desto leichter verstehen ihn auch andere, deren Hilfe Du ggf. in Anspruch nehmen willst.

              Ein guter Programmierstil ist viel wert.

              Viel eher wäre mir auch anzulasten, daß ich kein "strict" benutze, oder?

              Das ist ein Perl-spezifischer Aspekt - das, was ich anzumerken hatte, gilt für _jede_ Sprache.

              Viele Grüße
                    Michael

              1. Hallo Micha,

                Du hast vollkommen Recht, aber in dieser Größenordnung überblicke ich meine Scripte noch im Schlaf, ohne überheblich wirken zu wollen!

                Zu der Hilfe von anderen:
                Ich habe ja auch nur ein Teilproblem gepostet, ich hätte mich nie getraut, solch' wilden Salat als Frage zu formulieren.

                Mary,
                die eigentlich "Suppe" heißt, weil sie so heiß ist.

                P.S.: Im Endeffekt, hast Du es mal ausprobiert? Funktioniert doch geil, oder? Und darum dreht es sich ja.