Kurti: Ein oder mehr strings?

Hallo,
was ist korrekt bzw. eleganter

$text = $text . "\nWeiterer Text";
   oder
$text = "$text" . "\nWeiterer Text";
   oder
$text = "$text\nWeiterer Text";
   oder
... weitere bessere Variante?

  1. Hallo Kurti!

    ... weitere bessere Variante?

    $text .= "\nWeiter";

    Zu Deinen Beispielen:
    Du musst Dir im Klaren sein, was das alles bedeutet. Bist Du Dir das? Wenn nicht, »Einführung in Perl« lesen! ;)

    Viele Grüße aus Frankfurt/Main,
    Patrick

    --
    _ - jenseits vom delirium - _

       Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
    Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
  2. was ist korrekt bzw. eleganter
    $text = $text . "\nWeiterer Text";
       oder
    $text = "$text" . "\nWeiterer Text";
       oder
    $text = "$text\nWeiterer Text";
       oder
    ... weitere bessere Variante?

    Keine Variante.
    Variablen soll man nicht unnötig interpolieren.
    Die Operatoren .= += ||= helfen dir etwas Code sparen.

    mfg Beat

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische
    1. was ist korrekt bzw. eleganter
      $text = $text . "\nWeiterer Text";
         oder
      $text = "$text" . "\nWeiterer Text";
         oder
      $text = "$text\nWeiterer Text";
         oder
      ... weitere bessere Variante?

      Keine Variante.
      Variablen soll man nicht unnötig interpolieren.
      Die Operatoren .= += ||= helfen dir etwas Code sparen.

      Als Anfänger ist mir die kurze Schreibweise zu unübersichtlich. Was bedeutet in diesem Zusammenhang "interpolieren"?
      Und an Patrick:
      Ist das Ergebnis der obigen Varianten nicht identisch?
      Gruß
      Kurti

      1. Was bedeutet in diesem Zusammenhang "interpolieren"?

        Der Inhalt zwischen quotes "" '' q() qq() ist immer vom Typ String.
        Nun mach mal

        $var = 42;  #vom Typ Number  
        print "$var";  
        
        

        Erzwingt zuerst eine Konversion der Zahl nach einem String.

        Zweiter Nachteil:
        Dein Eiditor kann mit Syntax-Highligtting die Variablen hervorheben.
        Nicht so bei
        print "hallo $hallo hallo".

        Im übrigen habe ich mir "" quotes ziemlich abgewöhnt.
        Ich verwende nur noch '' und q().

        Besonders bei HTML Definitionen

        $element = '<input type="text" value="'.$value.'">';
        $element = q(<input type="text" value=").$value.q(">);

        " " ist hier reiner HTML Text.

        Einfache Anführungszeichen können nicht interpolieren.
        "user@example.org"  # oops Array @example ?
        "user@example.org" # OK aber
        'user@example.org'  # am Besten

        mfg Beat

        --
        ><o(((°>           ><o(((°>
           <°)))o><                     ><o(((°>o
        Der Valigator leibt diese Fische
        1. Erzwingt zuerst eine Konversion der Zahl nach einem String.

          Starkes Stück. Die Interpolation von nichts weiter als einer Variable ist immer ein Hinweis auf einen Programmierfehler, weil das häufig nichts nützliches macht (toll, $var hat jetzt (p)POK gesetzt, und das hilft uns genau wie weiter?), und manchmal etwas macht, das unerwartet ist (Stichpunkt überladene Stringifizierung); also generell vermieden werden sollte.

      2. Hallo Kurti!

        Ist das Ergebnis der obigen Varianten nicht identisch?

        Alle Deine Beispiele führen zum Ziel: Der Konkatenation zweier Strings. Die Kurzschreibweise ist jedoch die übersichtlichere, ja...

        Als Anfänger ist mir die kurze Schreibweise zu unübersichtlich.

        Das wird schon.

        Was bedeutet in diesem Zusammenhang "interpolieren"?

        Beat hat es bereits angesprochen: In einer print-Anweisung (zum Beispiel) wird eine Variable ausgegeben:

        my $op = "Kurti";  
        my $gruss = "Hallo $op";  
        print $gruss; # Hallo Kurti  
        my $gruss = 'Hallo $op';  
        print $gruss; # Hallo $op
        

        In Singlequotes (' ') werden Steuerzeichen auch nicht interpoliert:

        print 'Hallo\n$op'; # Hallo\n$op

        Dagegen:

        print "Hallo\n$op"; # Hallo  
                            # Kurti
        

        Als Anfänger [...]

        Dann erst recht »Einführung in Perl« lesen (letzte Ausgabe) - kann ich nur empfehlen!

        Viele Grüße aus Frankfurt/Main,
        Patrick

        --
        _ - jenseits vom delirium - _

           Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
        Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
        1. Hallo Beat, hallo Patrick,
          in meinen Beispielen kommt aber doch kein num. Wert vor.
          Muss bei der Angabe "$xxx" oder "\nxxx"  auch konvertiert werden?
          Und der Unterschied zwischen ' und " ist mir bekannt. In meinen Beispielen
          brauche ich aber doch " (oder q() oder andere) statt ', falls ich es in Strings angebe.
          Die Frage lautet daher jetzt.
          Wenn ich es nicht in der Kurzform angebe, welche der drei Varianten ist die beste?
          Gruß
          Kurti

          1. Hallo Kurti!

            Wenn ich es nicht in der Kurzform angebe, welche der drei Varianten ist die beste?

            Die Beste aus welcher Sicht? Performance? Code-Lesbarkeit?

            String concatenations dürften etwas mehr Performance kosten als die Doppelquote-Variante - aber da bin ich nicht sicher, da kann uns Struppi oder Beat sicher mehr dazu sagen. Auf jeden Fall ist:

            print $text, "\n", $text2;

            performanter als:

            print $text."\n".$text2;

            Aus Code-Lesbarkeit-Sicht ist immer noch die Kurzvariante (.=) die Eleganteste, aber die willst Du ja nicht :)

            Viele Grüße aus Frankfurt/Main,
            Patrick

            --
            _ - jenseits vom delirium - _

               Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
            Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
            1. String concatenations dürften etwas mehr Performance kosten als die Doppelquote-Variante - aber da bin ich nicht sicher, da kann uns Struppi oder Beat sicher mehr dazu sagen.

              String interpolation:
              $somevar = "text $var text";
              muss der Parser erst mal optimieren zu
              "text ".$var." text";
              Die Concatenation kostet dich also nichts gegenüber der Interpolation.
              Bei einem "" oder qq() wird aufwändiger geparst als bei '' oder q().
              Das ist die effektive Strafe. Deshalb: Vermeide "".

              Auf jeden Fall ist:

              print $text, "\n", $text2;

              performanter als:

              print $text."\n".$text2;

              Das liegt daran, dass print eh eine Liste als Argumente erwartet.

              Falls jemand ein Problem hat mit "\n"

              Scriptbeginn:

              use constant { NL => "\n", CRLF => "\015\012"};  
                
              print $text, NL,  
                    $text2, NL;  
                
              # oder bei print mail (Netzwerk Newline)  
                
              print $mail  
                 'MIME-Version: 1.0', CRLF,  
                 'From:', $mail{from}, CRLF,  
                 'To:', $mail{to}, CRLF,  
                 'Content-type:',$mail{ctype}, '; charset:', $mail{charset}, CRLF,  
                 #....  
                 CRLF,    #Close headersection  
                 $mail{body};  
              
              

              mfg Beat

              --
              ><o(((°>           ><o(((°>
                 <°)))o><                     ><o(((°>o
              Der Valigator leibt diese Fische
              1. Hallo Beat!

                String interpolation:
                $somevar = "text $var text";
                muss der Parser erst mal optimieren zu
                "text ".$var." text";
                Die Concatenation kostet dich also nichts gegenüber der Interpolation.
                Bei einem "" oder qq() wird aufwändiger geparst als bei '' oder q().
                Das ist die effektive Strafe. Deshalb: Vermeide "".

                Danke!

                Viele Grüße aus Frankfurt/Main,
                Patrick

                --
                _ - jenseits vom delirium - _

                   Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
              2. Danke an Euch beide.
                Kurti

              3. $somevar = "text $var text";
                muss der Parser erst mal optimieren zu
                "text ".$var." text";
                Die Concatenation kostet dich also nichts gegenüber der Interpolation.

                Deine unbelegte Behauptung stimmt aber nicht. Eine Optimierung findet so nicht statt; Interpolation benutzt immer mehr Opcodes als Verkettung.

                  
                
                > perl -MO=Terse -e'$somevar = "text $var text"; $somevar = "text ".$var." text";'  
                
                LISTOP (0x8fa260) leave [1]  
                    OP (0x8b77a0) enter  
                    COP (0x8aa5d0) nextstate  
                    BINOP (0x8aa590) sassign  
                        UNOP (0x8c44d0) null [67]  
                            OP (0x8c7020) null [3]  
                            BINOP (0x8ccce0) concat [4]  
                                BINOP (0xa6bcc0) concat [3]  
                                    SVOP (0x8c9900) const [10] PV (0x8c0f68) "text "  
                                    UNOP (0x8c5300) null [15]  
                                        PADOP (0x8c7280) gvsv  GV (0x8c1088) *var  
                                SVOP (0x925770) const [11] PV (0x8c0f80) " text"  
                        UNOP (0x8c4da0) null [15]  
                            PADOP (0x8ed0c0) gvsv  GV (0x8c0f38) *somevar  
                    COP (0x8f99b0) nextstate  
                    BINOP (0x9e4b10) sassign  
                        BINOP (0x8b7820) concat [9]  
                            BINOP (0x8b7760) concat [8]  
                                SVOP (0x8b76a0) const [5] PV (0x8c0fe0) "text "  
                                UNOP (0x8b7720) null [15]  
                                    PADOP (0x8b76e0) gvsv  GV (0x8c1088) *var  
                            SVOP (0xa1ec70) const [12] PV (0x8c1028) " text"  
                        UNOP (0xa1ec30) null [15]  
                            PADOP (0xa1ebf0) gvsv  GV (0x8c0f38) *somevar  
                -e syntax OK  
                
                
                1. perl -MO=Terse -e'$somevar = "text $var text"; $somevar = "text ".$var." text";'

                  Es ist mir leider nicht gelungen, den onliner auf meinem XP zum Laufen zu bringen.
                  Mich hätte noch die Variante

                  perl -MO=Terse -e'$somevar = q(a).$var.q(b);'

                  interessiert

                  mfg Beat

                  --
                  ><o(((°>           ><o(((°>
                     <°)))o><                     ><o(((°>o
                  Der Valigator leibt diese Fische
                  1. Hallo Beat!

                    perl -MO=Terse -e'$somevar = "text $var text"; $somevar = "text ".$var." text";'

                    Es ist mir leider nicht gelungen, den onliner auf meinem XP zum Laufen zu bringen.

                    Bei Windows muss es mit " anfangen, was zum Escape der reelen " zwingt:

                    perl -MO=Terse -e"$somevar = "text $var text"; $somevar = "text ".$var." text";"

                    so geht's doch:

                    C:>perl -MO=Terse -e"$somevar = "text $var text"; $somev
                    ar = "text ".$var." text";"
                    LISTOP (0x31c33e8) leave [1]
                        OP (0x31c3240) enter
                        COP (0x31c340c) nextstate
                        BINOP (0x31c3448) sassign
                            UNOP (0x31c3488) null [67]
                                OP (0x31c346c) null [3]
                                BINOP (0x31c34ac) concat [4]
                                    BINOP (0x31c34d0) concat [3]
                                        SVOP (0x31c3554) const [10] PV (0x283cfdc) "text "
                                        UNOP (0x31c3514) null [15]
                                            PADOP (0x31c3534) gvsv  GV (0x283d04c) *var
                                    SVOP (0x31c34f4) const [11] PV (0x283d00c) " text"
                            UNOP (0x31c3574) null [15]
                                PADOP (0x31c3594) gvsv  GV (0x283cfbc) *somevar
                        COP (0x31c3280) nextstate
                        BINOP (0x31c32bc) sassign
                            BINOP (0x31c32e0) concat [9]
                                BINOP (0x31c3324) concat [8]
                                    SVOP (0x31c3388) const [5] PV (0x283d06c) "text "
                                    UNOP (0x31c3348) null [15]
                                        PADOP (0x31c3368) gvsv  GV (0x283d04c) *var
                                SVOP (0x31c3304) const [12] PV (0x283d08c) " text"
                            UNOP (0x31c33a8) null [15]
                                PADOP (0x31c33c8) gvsv  GV (0x283cfbc) *somevar
                    -e syntax OK

                    C:>

                    Viele Grüße aus Frankfurt/Main,
                    Patrick

                    --
                    _ - jenseits vom delirium - _

                       Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                    Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
                    1. Ups, das Kopieren von der Konsole hat die Zeile geschnitten. So ist's natürlich richtig:

                      C:>perl -MO=Terse -e"$somevar = "text $var text"; $somevar = "text ".$var." text";"
                      LISTOP (0x31c33e8) leave [1]
                          OP (0x31c3240) enter
                          COP (0x31c340c) nextstate
                          BINOP (0x31c3448) sassign
                              UNOP (0x31c3488) null [67]
                                  OP (0x31c346c) null [3]
                                  BINOP (0x31c34ac) concat [4]
                                      BINOP (0x31c34d0) concat [3]
                                          SVOP (0x31c3554) const [10] PV (0x283cfdc) "text "
                                          UNOP (0x31c3514) null [15]
                                              PADOP (0x31c3534) gvsv  GV (0x283d04c) *var
                                      SVOP (0x31c34f4) const [11] PV (0x283d00c) " text"
                              UNOP (0x31c3574) null [15]
                                  PADOP (0x31c3594) gvsv  GV (0x283cfbc) *somevar
                          COP (0x31c3280) nextstate
                          BINOP (0x31c32bc) sassign
                              BINOP (0x31c32e0) concat [9]
                                  BINOP (0x31c3324) concat [8]
                                      SVOP (0x31c3388) const [5] PV (0x283d06c) "text "
                                      UNOP (0x31c3348) null [15]
                                          PADOP (0x31c3368) gvsv  GV (0x283d04c) *var
                                  SVOP (0x31c3304) const [12] PV (0x283d08c) " text"
                              UNOP (0x31c33a8) null [15]
                                  PADOP (0x31c33c8) gvsv  GV (0x283cfbc) *somevar
                      -e syntax OK

                      Wenn jetzt CPAN für die von den Laien erklären könnte, was das alles bedeutet, könnte ich es auch mal einsetzen und wissen, was ich tue ;)

                      Viele Grüße aus Frankfurt/Main,
                      Patrick

                      --
                      _ - jenseits vom delirium - _

                         Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                      Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
                      1. Hallo

                        Wenn jetzt CPAN für die von den Laien erklären könnte, was das alles bedeutet, könnte ich es auch mal einsetzen und wissen, was ich tue ;)

                        Ja, jetzt weiss ich armer Tor, genau so viel wie einst zuvor!

                        Und was ist letztlich zu empfehlen - Mikrosekunden Geschwindigkeitsgewinn oder Übersichtlichkeit (Wartbarkeit)?

                        Ist Variante 1 nicht leichter lesbarer als Variante 2
                        Variante 1:

                        qq~<input class='$class' id='$id1' name='$name' value='$wert' onClick='document.formular.Senden.disabled=false' $checkedNein>\n~;  
                        
                        

                        Variante 2:

                        q~<input class='~ . $class . q~' id='~ . $id1 . q~' name='~ . $name q~' value='~ . $wert . q~' onClick='document.formular.Senden.disabled=false'~ .  $checkedNein . '>' . NL;  
                        (Vielleicht habe ich irgendwo etwas vergessen, was aber für die Demo nicht relevant ist)  
                        
                        
                        1. Und was ist letztlich zu empfehlen - Mikrosekunden Geschwindigkeitsgewinn oder Übersichtlichkeit (Wartbarkeit)?

                          was ist wartbarer?
                          <element attribut="wert">
                          oder
                          <element attribut='wert'>

                          Was schliesst du aus der Antwort?
                          Wenn du dich von Anfang an richtig entscheidest, sparst du Stunden.

                          mfg Beat

                          --
                          ><o(((°>           ><o(((°>
                             <°)))o><                     ><o(((°>o
                          Der Valigator leibt diese Fische
                          1. Hallo Beat

                            was ist wartbarer?
                            <element attribut="wert">
                            oder
                            <element attribut='wert'>

                            Was schliesst du aus der Antwort?
                            Wenn du dich von Anfang an richtig entscheidest, sparst du Stunden.

                            Das verstehe ich leider nicht. Ich habe doch im Beispiel keine " angegeben, und es ging mir nicht mehr um " oder '.
                            Unter wartbarer verstehe ich u.a. übersichtlicher und dies gilt nach meinem Geschmack für Beispiel 1, wobei dies ja nach Aussagen in dem thread in Bezug auf die Performance ungünstig ist, da es zuerst aufgesplittet werden muss.
                            Ich hoffe ja noch, dass CPAN mit seiner optimalen Lösung herausrückt.
                            Für mich optimal heißt "Kompromiss zwischen Lesbarkeit und Performance", wobei ich eher zu mehr Lesbarkeit neige - ich möchte den Code auch noch 2 Jahren leicht verstehen, auch wenn ich dazwischen vielleicht nicht ge-'perlt' habe.
                            Gruß
                            Kurti

                            1. was ist wartbarer?
                              <element attribut="wert">
                              oder
                              <element attribut='wert'>

                              Was schliesst du aus der Antwort?
                              Wenn du dich von Anfang an richtig entscheidest, sparst du Stunden.
                              Das verstehe ich leider nicht. Ich habe doch im Beispiel keine " angegeben, und es ging mir nicht mehr um " oder '.

                              Ich wollte dich darauf aufnmerksam machen, dass es nur ein optimale Lösung für HTML-Attribut Quotes geben kann.
                              Daraus folgt dass " schon mal als Scalar-Delimiter wegfällt.

                              bei qq() verwendest du auch einen interpolierenden Kontext.
                              Jedoch mein Syntaxhighlighting kann darin versteckte Variablen nicht verstehen.
                              Ergo bleibt q() als Delimier. Du kannst ebenso gut gleich die einfachen Anführungszeichen verwenden und wie bei q() auf Interpolation verzichten.

                              Syntax am richtigen Ort macht den Code verständlich für Mensch und Maschine.

                              Full circle.

                              mfg Beat

                              --
                              ><o(((°>           ><o(((°>
                                 <°)))o><                     ><o(((°>o
                              Der Valigator leibt diese Fische
              4. Hallo,
                »

                Falls jemand ein Problem hat mit "\n"

                Scriptbeginn:

                [code lang=perl]use constant { NL => "\n", CRLF => "\015\012"};

                print $text, NL,
                      $text2, NL;

                Obiges wollte ich konsequent umsetzen, jetzt habe ich in einem Programm gefunden:

                Text .= "\r\nFehler .........";
                Entspricht \r\n   dem CRLF oder gibt es hierfür eine weitere empfohlene Konstante? Was bedeutet \r\n?
                Gruß
                Kurti