Stanload: welche Schreibweise ist richtig?

Hallo zusammmen!

Ich habe hier ein paar cgi-Dateien, die ich nun ein bissle übersichtlicher (leserlicher) gestalten möchte.

Derzeit schaut es so aus:
if ($passwort eq $correctpass) {
 passwortrichtig();
}
else {
 badpass();
}

Ist es auch möglich es wie filgt zu schreiben:
if ($passwort eq $correctpass)
{
 passwortrichtig();
}
else
{
 badpass();
}

Oder gar so:
Ist es auch möglich es wie filgt zu schreiben:
if ($passwort eq $correctpass)
{ passwortrichtig(); }
else
{ badpass(); }

Vielen Dank für eure Hilfe!

Bis denn

Stanload

  1. Hi,

    Im Prinzip geht es dir also darum, wie man Klammern schreibt. Hat nicht was mit CGI zu tun, ist überall das Gleiche ;-)

    Also ich mache das so:

    Wenn ein if nur eine Zeile hat, dann so:
    if (....)
      { anweisung; }

    oder wenn eine Variable belegt wird:

    $foo=(....)?true:false;

    Bei mehreren Zeilen mache ich es gerne so:
    if (.....) // gilt auch für switch,while,...
    {
      anweisung;
      anweisung;
    }

    Ich Finde das deutlich übersichtlicher, weil man die Klammern sofort findet. Keine Ahnung, wer darauf kam, die Klammern am Ende einer Zeile zu schreiben (if(....) { ), finden tut man sie lange nicht so schnell, zudem ist die Klammernzuordnung (welche gehört zu welcher) wesentlich schwieriger (meine Meinung).

    Aber da hat jeder seinen eigenen Stil, mich wundert nur, dass die Klammer-am-Ende-der-zeile-Methode so oft verwendet und gefordert wird.

    So long,
          Michael

    1. Bei mehreren Zeilen mache ich es gerne so:
      if (.....) // gilt auch für switch,while,...
      {
        anweisung;
        anweisung;
      }

      Diese Variante finde ich auch sehr angenehm zu lesen (mache es so zumindest in einer anderen Sprache), war mir aber nicht sicher, ob { in der zeile mit dem if stehen muss.
      Hierbei erkennt man nun wirklich schön, welche Klammer und Inhalt wozu gehören.

      Vielen Dank!

      Bis denn

      Stanload

  2. Hallo Stanload,

    welche Schreibweise nach offiziellen Maßstäben wirklich richtig ist, kann ich dir auch nciht sagen, wobei ich zumindest soviel weiß, als dass die öffnende geschweifte Klammer noch in der if-Zeile gesetzt wird. Aus den Seiten, die ich persönlich zu dem Thema kenne, dürfte folgender Code dem wohl zumindest recht nahe kommen:

    if ($passwort eq $correctpass) {
        passwortrichtig();
    }else{
        badpass();
    }

    Wie gesagt, ich bin mir da auch nur bedingt sicher, aber in dieser Form habe ich schon sehr häufig PHP-Code gesehen. Daher habe ich mich dem bisher unefähr so angepasst.
    Für die Übersichtlichkeit kannst du ja bei Bedarf auch noch Leerzeilen einfügen (machen viele, ich weniger).

    Hoffe, ich konnte dir zumindest etwas weiterhelfen.

    Gruß Patrick

  3. Und hier dann sofort noch ein Frage zur print-Anweisung:
    print "<SCRIPT LANGUAGE='JavaScript'>
     <!--
     var tipWin = null;
     function opentip()
     {
      ...
     }
     //-->
     </SCRIPT>";

    Kann ich nach dem " auch das "<SCRIPT> in die nächste Zeile packen?
    print "
     <SCRIPT LANGUAGE='JavaScript'>
     <!--

    Und hier noch was:
     print "<a href="viewprofile.cgi?user=$user_online" target="_blank">$user_online</a><br>\n";

    Da ich nun überall von print " auf print ' umgestiegen bin, würde ich dies auch gerne für diese Zeile, doch will es irgendwie nicht klappen (vielleicht wg. dem \n ?).

    1. Hallo,

      Kann ich nach dem " auch das "<SCRIPT> in die nächste Zeile packen?
      print "
      <SCRIPT LANGUAGE='JavaScript'>
      <!--

      Ja natürlich, allerdings würde sich bei mehrzeiligem Text auch der Einsatz von sog. here-Documents anbieten:
      print <<EOT;
      <script type="text/javascript">
      <!--
      ...
      </script>

      print "<a href="viewprofile.cgi?user=$user_online" target="_blank">$user_online</a><br>\n";

      Da ich nun überall von print " auf print ' umgestiegen bin, würde ich dies auch gerne für diese Zeile, doch will es irgendwie nicht klappen (vielleicht wg. dem \n ?).

      \n benötigt sog. Doublequotes, also beispielsweise das Einfassen des Textes in ", da diese Metazeichen sonst nicht interpoliert werden.
      BTW: Perl bietet auch noch die Möglichkeit an, ein beliebiges Quotingzeichen zu verwenden.

      print qq!<a href="viewprofile.cgi?user=$user_online" target="_blank">$user_online</a><br>\n!;

      ergibt die selbe Ausgabe wie Dein Beispiel, benötigt jedoch nicht den Einsatz von \ um das Quoting-Zeichen zu maskieren.

      Näheres findest Du in perldoc perlop, Kapitel "Quote and Quote-like Operators".

      Grüße
        Klaus

      1. Vielen Dank!

        Ja natürlich, allerdings würde sich bei mehrzeiligem Text auch der Einsatz von sog. here-Documents anbieten:
        print <<EOT;

        Hm, wofür steht dieses EOT?

        print qq!<a href="viewprofile.cgi?user=$user_online" target="_blank">$user_online</a><br>\n!;

        Und wie schaut es dann aus bei mehreren pront-Anweisungen hintereinander:
         print '<html>';
         print '<head>';

        Kann man sich die einzelnen prints auch irgendwie ersparen?

        Bis denn

        Stanload

        1. Erstmal, les die Dokus!

          Ja natürlich, allerdings würde sich bei mehrzeiligem Text auch der Einsatz von sog. here-Documents anbieten:
          print <<EOT;

          Hm, wofür steht dieses EOT?

          Das ist ein beliebiges Kürzel, in dem Fall will der Autor helfen es zu verstehen und nennt es End Of Text, du kannst ber hinschreiben was du willst.

          print <<ende_des_here_doc

          ende_des_here_doc

          gibt alles aus zwischen <<ende_des_here_doc und ende_des_here_doc (beachte es darf KEIN Tab oder Leerzeichne am Zeilenanfang stehen und (zumindest in älteren Perl versionen) es sollte auch nicht die letzte Zeile in deinem Programm sein.

          print qq!<a href="viewprofile.cgi?user=$user_online" target="_blank">$user_online</a><br>\n!;

          Und wie schaut es dann aus bei mehreren pront-Anweisungen hintereinander:
          print '<html>';
          print '<head>';

          Wie wär's mit ein bisschen Eigenleistung, soll heißen, probier's doch einfach mal.

          print qq!
          <html>
          <head>
          !;

          Aber, nur als Randbemerkung für die Aus/Eingabe von HTML/CGI Programmen ist das Modul CGI.pm bestens ausgerüstet und mitllionenfach getestet. Du wirst mehr freude haben, wenn du dich nicht mit solchen Sachen aufhälst, sondern dafür Module verwendest.

          use CGI qw/:standard/;
          print header(), start_html() , 'Hallo Stanload', end_html();

          So sieht dann ein einfaches Beispiel aus.

          Struppi.

          --
          Vergeßt die Mail Adresse, ich schau da nur einmal in hundert Jahren vorbei.
          1. use Mosche;

            Hm, wofür steht dieses EOT?
            Das ist ein beliebiges Kürzel, in dem Fall will der Autor helfen es zu verstehen und nennt es End Of Text, du kannst ber hinschreiben was du willst.

            print <<ende_des_here_doc

            Und bevor Nachfragen kommen ("das funktioniert nicht..."): da gehört ein Semikolon ans Ende der Zeile.

            use Tschoe qw(Matti);

            --
              Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
        2. Hallo,

          Hm, wofür steht dieses EOT?

          siehe dazu perldoc perldata, Kapitel "Scalar value constructors".

          Und wie schaut es dann aus bei mehreren pront-Anweisungen hintereinander:
          Kann man sich die einzelnen prints auch irgendwie ersparen?

          Ja sicherlich, siehe dazu die bereits genannten Stellen in der Perl-Dokumentation, bzw. auch http://selfhtml.teamone.de/cgiperl/sprache/zeichenketten.htm#regeln.

          Grüße
            Klaus

  4. Hallo,

    Derzeit schaut es so aus:
    if ($passwort eq $correctpass) {
    passwortrichtig();
    }
    else {
    badpass();
    }

    Das entspricht im Wesentliche dem, was auch in perldoc perlstyle empfohlen wird.

    if ($passwort eq $correctpass)
    {
    passwortrichtig();
    }
    else
    {
    badpass();
    }

    Ich persönlich empfinde diese Schreibweise als besser, da übersichtlicher. Allerdings gibt es auch viele, die es als Nachteil ansehen, daß diese Schreibweise mehr Zeilen als die erste Formatierungsvariante braucht.

    if ($passwort eq $correctpass)
    { passwortrichtig(); }
    else
    { badpass(); }

    Das finde ich nicht so toll, da es die Struktur des Programmes nicht wirklich erkennen läßt.

    Grundsätzlich gilt bei der Formatierung wie auch bei vielen anderen Aspekten der Perl-Programmierung der Grundsatz 'TMTOWTDI'. Hauptziel der Code-Formatierung sollte immer die gute Lesbarkeit und ein schnelles Erkennen der Programmstruktur sein. Ein Muß, im Sinne eines Gesetzes, für irgendeine Formatierung gibt es an sich nicht.

    Grüße
      Klaus