Gassigeher: Perl-Variable innerhalb von Strings

Hallo,
bei meinem Versuch, mich in Perl einzuarbeiten, ist mir aufgefallen, dass manchmal
$var2 = "hier ist " . $var1;       manchmal $var2 = "hier ist $var1";
Worin liegt der Unterschied im Ergebnis?
Danke

  1. bei meinem Versuch, mich in Perl einzuarbeiten, ist mir aufgefallen, dass manchmal
    $var2 = "hier ist " . $var1;       manchmal $var2 = "hier ist $var1";
    Worin liegt der Unterschied im Ergebnis?

    Das erste ist eine Stringverknüpfung und im zweiten Fall wird die Variabel interpoliert, also in einem String angezeigt. Das geht nur in doppelten Anführungszeichen. Das erste Beispiel könntest du auch in einfachen Anführungszeichen schreiben und solltest es auch.

    Das zweite ist lesbarer, das erste sauberer, weil du so die Variabel erkennst, und vermutlich schneller, weil nichts interpoliert werden muss.

    Schöner ist für solche Fälle printf

    Struppi.

    1. Danke Struppi,

      Das erste Beispiel könntest du auch in einfachen Anführungszeichen schreiben und solltest es auch.

      Warum einfache Anführungszeichen?
      Gruß
      Gassigeher

      1. Warum einfache Anführungszeichen?

        Weil dann nicht nutzlos interpoliert (= Ersetzen der Variable durch ihren Inhalt) wird.

        Siechfred

        --
        Obacht, hinter jedem noch so kleinen Busch könnte ein Indianer sitzen!
        1. Warum einfache Anführungszeichen?

          Weil dann nicht nutzlos interpoliert (= Ersetzen der Variable durch ihren Inhalt) wird.

          Danke!

      2. Das erste Beispiel könntest du auch in einfachen Anführungszeichen schreiben und solltest es auch.

        Warum einfache Anführungszeichen?

        Ergänzend: weil Perl dann gar nicht erst sich die Mühe machen muss zu schauen ob etwas interpoiert werden müßte.

        Struppi.

    2. Hi

      Das zweite ist lesbarer, das erste sauberer, weil du so die Variabel erkennst, und vermutlich schneller, weil nichts interpoliert werden muss.

      Intern wandelt Perl alle Interpolationen in String-Concats um. D.h. bestenfalls die Compilerphase kann langsamer werden ...

      Ciao
        LanX

  2. Hallo,
    danke für die Hilfe bisher.
    Ich wollte jetzt möglichst viel umstellen und bin dann doch wieder auf Probleme gestoßen.
    Beispiel: Bei der Umstellung von "\n" auf '\n'.
    Daher die Frage:
    1. Was wird "interpoliert" und muss daher in " und nicht in ' stehen?
    Bisher dachte ich nur $... und @...

    2. Könnte ich bei $assignURL{"$_[0]"} die " weglassen?

    3. Wie könnte man im folgenden Beispiel dieses Gewirr von " und ' einfacher darstellen?
    if ($f eq 'x')
        {print "<input type='text' name='obj'  value="$obj">\n"}

    Danke

    1. Beispiel: Bei der Umstellung von "\n" auf '\n'.

      Maskierte Zeichen müssen auch in doppelte Anführungszeichen.

      1. Könnte ich bei $assignURL{"$_[0]"} die " weglassen?

      Auf jeden Fall.

      1. Wie könnte man im folgenden Beispiel dieses Gewirr von " und ' einfacher darstellen?
        if ($f eq 'x')
            {print "<input type='text' name='obj'  value="$obj">\n"}

      Mal abgesehen davon, dass ein Zeilenumbruch hier nicht notwendig ist, dem Browser ist es egal, kannst du hier z.b.

      print qq/<input type="text" name="obj"  value="$obj">/;  
      
      

      Oder mit dem CGI Modul (das du wahrscheinlich sowieso verwendest)

      print CGI::textfield(-name => 'obj', -value => $obj);

      Struppi.

      1. Danke für Deine Hilfe!

        Oder mit dem CGI Modul (das du wahrscheinlich sowieso verwendest)

        print CGI::textfield(-name => 'obj', -value => $obj);

        Mit dem kann ich mich nicht anfreunden.

        Hast Du vielleicht auch eine Erklärung für folgendes:
        $fehler = "$fehler<br>"$wert"$fehler_tab{"$sprache"}{"F23"}"$feld"";
        funktioniert und
        $fehler = "$fehler<br>"$wert"$fehler_tab{"$sprache"}{'F23'}"$feld"";
        bringt Syntaxfehler- warum?
        Danke

        1. Danke für Deine Hilfe!

          Oder mit dem CGI Modul (das du wahrscheinlich sowieso verwendest)

          print CGI::textfield(-name => 'obj', -value => $obj);

          Mit dem kann ich mich nicht anfreunden.

          Weil?
          Du hast damit eigentlich nur Vorteile, z.b. auch selbstausfüllende Formulare, du kannst einfach Auswahlboxen erstellen, es sieht besser aus und darüber hinaus auch wichtig, du trennst HTML Code von Programmcode, da du nur Funktionen nutzt.

          Hast Du vielleicht auch eine Erklärung für folgendes:
          $fehler = "$fehler<br>"$wert"$fehler_tab{"$sprache"}{"F23"}"$feld"";
          funktioniert und
          $fehler = "$fehler<br>"$wert"$fehler_tab{"$sprache"}{'F23'}"$feld"";
          bringt Syntaxfehler- warum?

          Ich würde dir dringend empfehlen, wenn du schon nicht das CGI Modul verwenden möchtest (wobei du es sicher einbindest und nur param() verwendest, d.h. du bindest über 200KB Code ein, um eine Funktion zu nutzen?), dann benutzt für sowas printf oder einen von diesen Operatoren.
          . So wie du es jetzt machst, ist es unübersichtlich und fehleranfällig.

          Struppi.

          1. Hast Du vielleicht auch eine Erklärung für folgendes:
            $fehler = "$fehler<br>"$wert"$fehler_tab{"$sprache"}{"F23"}"$feld"";
            funktioniert und
            $fehler = "$fehler<br>"$wert"$fehler_tab{"$sprache"}{'F23'}"$feld"";
            bringt Syntaxfehler- warum?

            Ich würde dir dringend empfehlen, wenn du schon nicht das CGI Modul verwenden möchtest (wobei du es sicher einbindest und nur param() verwendest, d.h. du bindest über 200KB Code ein, um eine Funktion zu nutzen?), dann benutzt für sowas printf oder einen von diesen Operatoren.
            . So wie du es jetzt machst, ist es unübersichtlich und fehleranfällig.

            Ich werde versuchen, mich zu bessern, aber in dem obigen Beispiel habe ich doch nur bei einem String " durch ' ersetzt.
            Ist ' nicht erlaubt?
            Gruß
            Gassigeher

            1. Ich werde versuchen, mich zu bessern, aber in dem obigen Beispiel habe ich doch nur bei einem String " durch ' ersetzt.
              Ist ' nicht erlaubt?

              Doch, du musst dir vielleicht klar werden was das maskieren bedeutet. Innerhalb von einfachen Anführungszeichen musst du einfache Anführungszeichen maskieren und sonst nichts. Es werden aber keine Variabeln "übersetzt" (interpoliert).
              In doppelten Anführungszeichen musst du doppelte Anführungszeichen maskieren und kannst Steuerzeichen verwenden, wie z.b. \n, \t und Variabeln werden interpoliert.

              Aber man versucht solche Maskierungsorgien zu vermeiden, das machen nur PHP Programmierer. du kannst mit den vielfältigen Operatoren (den Abschnitt den ich dir in der Doku gezeigt habe), völlig auf sowas verzichten und in dem Fall     ist das CGI Modul eh am besten oder u.U. auch ein Template Modul.

              Ein weiteres Problem in deinem Code sind die Anführungszeichen um die Hash-Keys, die sind nur nötig wenn der Schlüßel ein reserviertes Wort ist. Ansonsten lass sie einfach weg.

              Struppi.

              1. Danke Struppi,
                jetzt bin ich wunschlos glücklich!

    2. Hallo,
      danke für die Hilfe bisher.
      Ich wollte jetzt möglichst viel umstellen und bin dann doch wieder auf Probleme gestoßen.
      Beispiel: Bei der Umstellung von "\n" auf '\n'.
      Daher die Frage:

      1. Was wird "interpoliert" und muss daher in " und nicht in ' stehen?
        Bisher dachte ich nur $... und @...

      2. Könnte ich bei $assignURL{"$_[0]"} die " weglassen?

      3. Wie könnte man im folgenden Beispiel dieses Gewirr von " und ' einfacher darstellen?
        if ($f eq 'x')
            {print "<input type='text' name='obj'  value="$obj">\n"}

      Danke

      Und noch was:
      $fehler = "$fehler<br>"$wert"$fehler_tab{"$sprache"}{"F23"}"$feld"";
      funktioniert und
      $fehler = "$fehler<br>"$wert"$fehler_tab{"$sprache"}{'F23'}"$feld"";
      bringt Syntaxfehler- warum?

      1. Hi

        $fehler = "$fehler<br>"$wert"$fehler_tab{"$sprache"}{'F23'}"$feld"";

        MANN O MANN ist das grausam, da verliert man ja jede Lust den menschlichen Lexer zu spielen...

        Perls Interpolation funktioniert ungefähr so, dass er in "...$var..." Bereichen alle Variablen rausholt und vorm compilieren in eine Verknüfung
        '...' . $var . '...' übersetzt.

        Eine deiner Variablen ist AFAIS ein HoH namens $fehler_tab{"$sprache"}{'F23'} was umgesetzt wird zu

        ...' . $fehler_tab{"$sprache"}{'F23'} . '...'
                                       ^     ^
        und die escapten quotes (markiert ^) kann Perl im Code nicht gebrauchen, da versagt IMHO das Autoquoting für Hashkeys.

        So und jetzt ein kleiner Kurs wie du das Zeug *lesbar* machen kannst
        --------------------------------------------------------------------

        Perl kennt die Funktionen q() für ' und qq() für " dann brauchst du auch nicht mehr zu escapen[*]. Aternativ gibts Here-Documents. Mach dich mal klug!!!

        ALSO:

          
        $fehler = qq(  
                $fehler <br> "$wert" $fehler_tab{$sprache}{F23} "$feld"  
        );  
        # oder  
        $fehler = <<"__ENDZEILE";  
                $fehler <br> "$wert" $fehler_tab{$sprache}{F23} "$feld"  
        __ENDZEILE  
        
        

        Tschau
         LanX

        [*] der geneigte Leser mag anmerken das dann () escaped werden müssen, dass ist aber nur die halbe Wahrheit weil Perl einem eine ganze Latte an alternativen Klammerpaaren und Bezeichnern anbietet, d.h. sowohl q[] oder auch q{} oder auch q// oder auch q## usw gingen zur Not, wenn man denn keine Here-Docs mag.

        1. HI

          Mach dich mal klug!!!

          ah ich seh gerade das Struppi dir die Operatoren schon verlinkt hat, aber ich hoffe es hilft trotzdem!

          Tschau
           LanX