Thomas N: $betragRund = sprintf("%.2f", $betrag); bei CGI?

Hallo!
Schuster bleib bei deinen Sohlen, sagte man mal seiner Zeit...

Nun bei $betragRund kommt zwar eine Zahl mit zwei Kommastellen - wie gewollt - aber diese sind immer Null.
$betragRund = sprintf("%.2f", $betrag);

Als KonsolenScript funktioniert die Kürzung.

Benutze ich printf verrutscht in meiner HTML-Ausgabe eine Zahl links oben in die Ecke und mein
$betragRund ist einfach immer nur eins.
Übrigens, ich bin Programmieranfänger und eigentlich ziemlich stolz, dass ich mit diesen doofen Programmierbüchern
überhaupt soweit gekommen bin!
Guts Nächtle.

Thomas N

-----------------------------------------

Das Script:

use strict;
use CGI qw(:standard);

my($betrag, $wahl, $ergebnis, $eurokurs, $ergebnis, $betragRund, $ergebnisRund);
my $betrag = param('betrag');
$wahl = param('devisen');

$betragRund = sprintf("%.2f", $betrag);

$eurokurs = 1.95583;

#regulärer Ausdruck (,) wird durch (.) ersetzt.
$betrag =~ s/,/./;

if   ($wahl == 1)
                {
                $ergebnis = $betragRund / $eurokurs;

#reduzieren der Nachkomma-Stellen auf zwei.
                $ergebnisRund = sprintf("%.2f", $ergebnis);
print qq|
                <HTML>
                <HEAD>
                <TITLE>15702_5</TITLE>
                </HEAD>
                <BODY><div align="center"><h1>Umrechnung:</h1>
                <hr noshade size="1" width=200>
                <table border="0" cellspacing="0" cellpadding="10" bgcolor="#EFEFEF">
                <tr><td>$betragRund DM sind: <b>$ergebnisRund Euro</b></td></tr></table>
                </div></BODY></HTML>
|;
                }

elsif($wahl == 2)
                {
                $ergebnis = $betrag * $eurokurs;
                $ergebnisRund = sprintf("%.2f", $ergebnis);
print qq|
                <HTML>
                <HEAD>
                <TITLE>15702_5</TITLE>
                </HEAD>
                <BODY><div align="center"><h1>Umrechnung:</h1>
                <hr noshade size="1" width=200>
                <table border="0" cellspacing="0" cellpadding="10" bgcolor="#EFEFEF">
                <tr><td>$betragRund Euro sind: <b>$ergebnisRund DM</b></td></tr></table>
                </div></BODY></HTML>
|;
                }

else
                {
                print header;
                print start_html('Error');
                print h1('Die Wahlmoeglichkeit existiert nicht, bitte wälen Sie eine Umrechnungsart aus!');
                print end_html;
                }

  1. Hi,

    Nun bei $betragRund kommt zwar eine Zahl mit zwei
    Kommastellen - wie gewollt - aber diese sind immer
    Null.
    $betragRund = sprintf("%.2f", $betrag);

    nicht das Runden geht bei Dir schief, sondern m. E.
    schon die Berechnung von $betrag:

    $ergebnis = $betragRund / $eurokurs;

    Laß Dir mal ausgeben, was an dieser Stelle in $ergebnis
    steht.

    Als KonsolenScript funktioniert die Kürzung.

    Das glaube ich nicht.

    Viele Grüße
    <img src="http://www.schroepl.net/projekte/gzip_cnc/gzip_cnc.gif" border=0 alt=""> Michael

    1. Hi,

      Nun bei $betragRund kommt zwar eine Zahl mit zwei
      Kommastellen - wie gewollt - aber diese sind immer
      Null.
      $betragRund = sprintf("%.2f", $betrag);

      nicht das Runden geht bei Dir schief, sondern m. E.
      schon die Berechnung von $betrag:

      $ergebnis = $betragRund / $eurokurs;

      Laß Dir mal ausgeben, was an dieser Stelle in $ergebnis
      steht.

      Als KonsolenScript funktioniert die Kürzung.
      Das glaube ich nicht.

      Also hier das KonsolenScript, bei mir funktionierts - mal abgesehen, dass ich $betrag = ? habe, wenn ich über <stdin> nichts eingebe, was meinst Du?:
      Viele Grüße
      Thomas N

      __________________________________________________________________
      #!/usr/bin/perl -w
      use strict;
      my($betrag, $wahl, $eurokurs, $ergebnis, $betragR, $ergebnisRund);
      $eurokurs = 1.95583;

      print "Geben Sie den umzurechnenden Betrag ein:\n";
      $betrag = <stdin>;
      chomp($betrag);
      $betrag =~ s/,/./;
      $betragR = sprintf("%.2f", $betrag);

      print "DM <=> Euro (1)?\n";
      print "Euro <=> DM (2)?\n";

      print "Ihre Wahl? :\n";
      $wahl = <stdin>;
      chomp($wahl);

      if   ($wahl == 1)
        {
        $ergebnis = $betragR / $eurokurs;
        $ergebnisRund = sprintf("%.2f", $ergebnis);

      print $betragR;
        print " DM sind ";
        print $ergebnisRund;
        print " Euro\n";
        }

      elsif   ($wahl == 2)
        {
        $ergebnis = $betragR * $eurokurs;
        $ergebnisRund = sprintf("%.2f", $ergebnis);
        print $betragR, " Euro sind ", $ergebnisRund, " DM.\n";
        }

      else
        {
        print "Die Wahlmoeglichkeit '", $wahl, "' existiert nicht!\n";
        }

  2. Hallo,

    my $betrag = param('betrag');
    $betragRund = sprintf("%.2f", $betrag);
    $betrag =~ s/,/./;

    Findest Du nicht, daß diese Subtsitution etwas spät erfolgt?

    Grüße
      Klaus

    1. Hallo,

      my $betrag = param('betrag');
      $betragRund = sprintf("%.2f", $betrag);
      $betrag =~ s/,/./;

      Findest Du nicht, daß diese Subtsitution etwas spät erfolgt?

      Ja, aber nur etwas, oder? ;-)

      Danke
      Thomas N

      1. Hi,

        Findest Du nicht, daß diese Subtsitution etwas spät erfolgt?
        Ja, aber nur etwas, oder? ;-)

        you made my day :-)

        Cheatah

  3. Hi,

    $betragRund = sprintf("%.2f", $betrag);
    Benutze ich printf verrutscht in meiner HTML-Ausgabe eine Zahl links oben in die Ecke und mein
    $betragRund ist einfach immer nur eins.

    printf macht eine Ausgabe und gibt, wie jede geglückte Aktion, einen wahren Wert zurück, also 1. Genauso wird nach "my $temp = print 'bla';" in $temp der Wert 1 stehen.

    use strict;
    use CGI qw(:standard);

    Sehr schön!

    my($betrag, [...]
    my $betrag [...]

    Das hingegen ist etwas zu viel des Guten :-) Bitte nur ein 'my' pro Variable und Scope.

    my $betrag = param('betrag');

    Übrigens ist $betrag undef, wenn kein entsprechender Parameter an das CGI-Script übergeben wurde. Besser wäre in solchen Fällen:

    my $betrag = param('betrag') || 0;

    $wahl = param('devisen');

    Noch'n übrigens: Du kannst auch mehrere Variablen gleichzeitig deklarieren und füllen, inklusive Defaultwerte:

    my ($betrag, $wahl, $eurokurs) = (param('betrag')||0, param('devisen')||1, 1.95583);

    Cheatah

    1. Hi,

      my $betrag = param('betrag');

      Übrigens ist $betrag undef, wenn kein entsprechender Parameter an das CGI-Script übergeben wurde. Besser wäre in solchen Fällen:

      my $betrag = param('betrag') || 0;

      Ja, das funktioniert, an das Problem hat ich noch nicht dran gedacht!
      Aber wie mach ich das bei meiner Konsolenversion?

      print "Geben Sie den umzurechnenden Betrag ein:\n";
      $betrag = <stdin> || 0;
      chomp($betrag)
      $betragR =~ s/,/./;

      So funktioniert es dort nicht!
      Wenn ich nichts eingebe sagt mir die Konsole:
      Argument "" isn't numeric in sprintf at 15702_4.pl line 19, <stdin> line 1.

      Auch so gehts nicht - mal davon abgesehen, dass es sicher nicht elegant ist.

      $betrag = 0;
      $betrag = <stdin>;
      chomp($betrag)
      $betragR =~ s/,/./;

      Aber sollte nicht $betrag gleich Null sein, wenn ich nichts über <stdin> eingebe? Was passiert mit $betrag, wenn ich über  <stdin> nichts eingebe?

      Thomas N

      1. Hi,

        $betrag = <stdin> || 0;

        nein, von STDIN kommt ja mit Sicherheit was, und wenn es nur ein Enter ist. Nach

        chomp($betrag)

        kannst Du dann mittels

        $betrag ||= 0;

        obige Aktion nachholen.

        So funktioniert es dort nicht!

        Und die Fehlerbeschreibung ist...? ;-)

        $betrag = 0;
        $betrag = <stdin>;

        Nützt nichts; $betrag wird ja durch STDIN komplett überschrieben. Wenn dort undef rauskommen _könnte_, wäre es das in jedem Fall, egal ob Du die Variable initialisierst oder nicht.

        Aber sollte nicht $betrag gleich Null sein, wenn ich nichts über <stdin> eingebe?

        Nein, sondern "\n", oder was immer lokal der Zeilenumbruch ist. Übrigens: Handler schreibt man groß, so auch STDIN.

        Cheatah

        1. Hi,

          $betrag = <stdin> || 0;

          nein, von STDIN kommt ja mit Sicherheit was, und wenn es nur ein Enter ist.

          Ja klar, ENTER!

          Nach chomp($betrag) kannst Du dann mittels

          $betrag ||= 0;

          obige Aktion nachholen.

          Funktioniert prima!.

          Aber wie soll ich das verstehen?
          Mit dem logischen Operator (oder) frage ich eine Bedingung ab, doch hier seh ich gar keine "Bedingungvoraussetzung" ($betrag oder =0) gibt doch gar keinen Sinn?
          Und wie kommt die Zuweisung (0) für $betrag zustande?
          $betrag ist z.B. "\n" (weil ich nur enter gedrückt habe), wie kommt jetzt $betrag dazu den Wert Null anzunehmen?
          Anders, gebe ich für $betrag einen Wert ein (77), wie kommt es, dass dieser nicht mit Null überschrieben wird?

          Übrigens: Handler schreibt man groß, so auch STDIN.

          Übrigens: Handler schreibt man mit ä, wie den Krämer! ;-)

          Wo find ich in selfhtml etwas über die Schreibweise von Handles, bis jetzt hab ich dort nichts gefunden.

          Thomas N

          1. $betrag ||= 0;

            obige Aktion nachholen.
            Funktioniert prima!.

            Aber wie soll ich das verstehen?
            Mit dem logischen Operator (oder) frage ich eine Bedingung ab, doch hier seh ich gar keine "Bedingungvoraussetzung" ($betrag oder =0) gibt doch gar keinen Sinn?

            Du solltest Dich einmal mit dem entsprechenden Kapitel aus der Perl-Dokumentation beschäftigen (perldoc perlop).

            Und wie kommt die Zuweisung (0) für $betrag zustande?
            $betrag ist z.B. "\n" (weil ich nur enter gedrückt habe), wie kommt jetzt $betrag dazu den Wert Null anzunehmen?

            TRUE ist bei Perl alles was nicht undefined, 0, oder ein leerer String ist (*wennichnurnochwüßtewodaswiedersteht*). Wenn also ein Ausdruck (hier $betrag) TRUE ist, dann passiert nichts, ansonsten die Zuweisung von 0.

            Anders, gebe ich für $betrag einen Wert ein (77), wie kommt es, dass dieser nicht mit Null überschrieben wird?

            77 ist bei einer Bedingung einfach nur TRUE.

            Wo find ich in selfhtml etwas über die Schreibweise von Handles, bis jetzt hab ich dort nichts gefunden.

            Nicht alles wird in selfhtml abgehandelt. Dafür gibt es auch eine ziemlich umfangreiche Produktdokumentation[1]:

            perldoc perlstyle

            Grüße
              Klaus

            [1] Die Standard-HTML-Doku von Activeperl umfaßt  derzeit ca. 11 MByte.

            1. Hi,

              Mit dem logischen Operator (oder) frage ich eine Bedingung ab, doch hier seh ich gar keine "Bedingungvoraussetzung" ($betrag oder =0) gibt doch gar keinen Sinn?
              Du solltest Dich einmal mit dem entsprechenden Kapitel aus der Perl-Dokumentation beschäftigen (perldoc perlop).

              stimmt auffällig - und in der Zwischenzeit vielleicht auch mal überlegen, wie man "$x += 3;" noch schreiben könnte ;-)

              TRUE ist bei Perl alles was nicht undefined, 0, oder ein leerer String ist (*wennichnurnochwüßtewodaswiedersteht*).

              perldoc perldata

              Anders, gebe ich für $betrag einen Wert ein (77), wie kommt es, dass dieser nicht mit Null überschrieben wird?
              77 ist bei einer Bedingung einfach nur TRUE.

              Anders gesagt: perldoc perlop ;-)

              Nicht alles wird in selfhtml abgehandelt. Dafür gibt es auch eine ziemlich umfangreiche Produktdokumentation[1]:

              ...Mit der man sich eingehend beschäftigen sollte. SelfHTML ist auch "nur" Sekundärliteratur und kann daher mit einer Dokumentation keinesfalls konkurrieren. Man kann damit Grundlagen erlernen, Tipps bekommen, Praxisbeispiele finden (zusätzlich zu denen in der Doku) usw., aber SelfHTML oder ein anderes Werk, egal wie gut es sein mag, ersetzt _niemals_ den Blick in die Doku.

              perldoc perlstyle

              Fangen wir einfach mal klein an:

              perldoc perl
              perldoc perldoc
              perldoc perlfaq (hier immer mal nach den eigenen Problemen suchen!)
              perldoc perlstyle
              perldoc CGI

              und natürlich:

              perldoc strict
              perldoc perlrun (-w)
              perldoc -f my

              Außerdem sollte man http://www.cpan.org/ kennen :-)

              Cheatah

              1. Hi,

                Anders gesagt: perldoc perlop ;-)

                Nicht alles wird in selfhtml abgehandelt. Dafür gibt es auch eine ziemlich umfangreiche Produktdokumentation[1]: ...Mit der man sich eingehend beschäftigen sollte. SelfHTML ist auch "nur" Sekundärliteratur und kann daher mit einer Dokumentation keinesfalls konkurrieren. Man kann damit Grundlagen erlernen, Tipps bekommen, Praxisbeispiele finden (zusätzlich zu denen in der Doku) usw., aber SelfHTML oder ein anderes Werk, egal wie gut es sein mag, ersetzt niemals den Blick in die Doku. perldoc perlstyle Fangen wir einfach mal klein an: perldoc perl perldoc perldoc perldoc perlfaq (hier immer mal nach den eigenen Problemen suchen!) perldoc perlstyle perldoc CGI und natürlich: perldoc strict perldoc perlrun (-w) perldoc -f my Außerdem sollte man http://www.cpan.org/ kennen :-)

                Also, bin ich hier erstmal richtig, siehe Auflistung unten?? Aber wo ist perldoc? Oder ist DAS perldoc?

                For ease of access, the Perl manual has been split up into several sections:

                perl                Perl overview (this section)     perlfaq             Perl frequently asked questions     perltoc             Perl documentation table of contents     perlbook            Perl book information

                perlsyn             Perl syntax     perldata            Perl data structures     perlop              Perl operators and precedence     perlsub             Perl subroutines     perlfunc            Perl builtin functions     perlreftut          Perl references short introduction     perldsc             Perl data structures intro     perlrequick         Perl regular expressions quick start     perlpod             Perl plain old documentation     perlstyle           Perl style guide     perltrap            Perl traps for the unwary

                perlrun             Perl execution and options     perldiag            Perl diagnostic messages     perllexwarn         Perl warnings and their control     perldebtut          Perl debugging tutorial     perldebug           Perl debugging

                perlvar             Perl predefined variables     perllol             Perl data structures: arrays of arrays     perlopentut         Perl open() tutorial     perlretut           Perl regular expressions tutorial

                perlre              Perl regular expressions, the rest of the story     perlref             Perl references, the rest of the story

                perlform            Perl formats

                perlboot            Perl OO tutorial for beginners     perltoot            Perl OO tutorial, part 1     perltootc           Perl OO tutorial, part 2     perlobj             Perl objects     perlbot             Perl OO tricks and examples     perltie             Perl objects hidden behind simple variables

                perlipc             Perl interprocess communication     perlfork            Perl fork() information     perlnumber          Perl number semantics     perlthrtut          Perl threads tutorial

                perlport            Perl portability guide     perllocale          Perl locale support     perlunicode         Perl unicode support     perlebcdic          Considerations for running Perl on EBCDIC platforms

                perlsec             Perl security

                perlmod             Perl modules: how they work     perlmodlib          Perl modules: how to write and use     perlmodinstall      Perl modules: how to install from CPAN     perlnewmod          Perl modules: preparing a new module for distribution

                perlfaq1            General Questions About Perl     perlfaq2            Obtaining and Learning about Perl     perlfaq3            Programming Tools     perlfaq4            Data Manipulation     perlfaq5            Files and Formats     perlfaq6            Regexes     perlfaq7            Perl Language Issues     perlfaq8            System Interaction     perlfaq9            Networking

                perlcompile         Perl compiler suite intro

                perlembed           Perl ways to embed perl in your C or C++ application     perldebguts         Perl debugging guts and tips     perlxstut           Perl XS tutorial     perlxs              Perl XS application programming interface     perlclib            Internal replacements for standard C library functions     perlguts            Perl internal functions for those doing extensions     perlcall            Perl calling conventions from C     perlutil            utilities packaged with the Perl distribution     perlfilter          Perl source filters     perldbmfilter       Perl DBM filters     perlapi             Perl API listing (autogenerated)     perlintern          Perl internal functions (autogenerated)     perlapio            Perl internal IO abstraction interface     perltodo            Perl things to do     perlhack            Perl hackers guide

                perlhist            Perl history records     perldelta           Perl changes since previous version     perl5005delta       Perl changes in version 5.005     perl5004delta       Perl changes in version 5.004

                perlaix             Perl notes for AIX     perlamiga           Perl notes for Amiga     perlbs2000          Perl notes for POSIX-BC BS2000     perlcygwin          Perl notes for Cygwin     perldos             Perl notes for DOS     perlepoc            Perl notes for EPOC     perlhpux            Perl notes for HP-UX     perlmachten         Perl notes for Power MachTen     perlmacos           Perl notes for Mac OS (Classic)     perlmpeix           Perl notes for MPE/iX     perlos2             Perl notes for OS/2     perlos390           Perl notes for OS/390     perlsolaris         Perl notes for Solaris     perlvmesa           Perl notes for VM/ESA     perlvms             Perl notes for VMS     perlvos             Perl notes for Stratus VOS     perlwin32           Perl notes for Windows

                Thomas N

                1. Hallo,

                  Also, bin ich hier erstmal richtig, siehe Auflistung unten??
                  Aber wo ist perldoc? Oder ist DAS perldoc?

                  Ja, Du bist da sicher richtig, und ja, daß ist 'perldoc', zumindest der Grundlagenbereich. Nicht vergessen solltest Du die Dokumentationen der einzelnen Module, die Du mit
                  perldoc Modulname
                  erreichst, und in der BAsisdokumentation so nicht aufgeführt ist.
                  Alles zusammen findest Du i.d.R. auf Deiner Festplatte, da Du ja sicherlich auch lokal ein Perl installiert hast. Dazuz stehen Dir das Online-Angebot unter http://www.perldoc.com bzw. die Buchform (Programming Perl von O'Reilly) als Alternative zur Wahl.

                  Also, viel Spaß beim Schmökern;-)

                  Grüße
                    Klaus

                  1. Hallo,

                    Aber wo ist perldoc? Oder ist DAS perldoc?

                    die Buchform (Programming Perl von O'Reilly) als Alternative zur Wahl.

                    Das Buch werde ich sicher nicht kaufen!
                    Aber vielleicht (Programmieren mit Perl von Wall) ;-)

                    Also, viel Spaß beim Schmökern;-)

                    Danke.

                    Ich beisse mir nur in den Hintern, dass ich dieses teure blöde Buch (Perl Der Einstieg, Galileo Press) gekauft habe :-(
                    Perl für Dummies hab ich nach einem Tag zum Glück wieder zurück in den Buchladen getragen.
                    Und und und!
                    Also ich find es sehr schwierig, Programmieren zu lernen ob nun die eine oder die andere Sprache ist nach meiner Schnupperei (war erst 5 Tage in der VHS c++ lernen) egal, aber beides zusammen, also Programmieren und Sprache!? Ich schreibe mal ein richtig gutes AnfängerBuch zum Programmieren! Wo alles schön erklärt wird, so dass man dann frei seiner Kreativität den Lauf lassen kann... :-))

                    Grüße
                    Thomas N

                    1. Hi,

                      Also ich find es sehr schwierig, Programmieren zu
                      lernen ob nun die eine oder die andere Sprache ist

                      damit bist Du nicht allein.

                      Programmieren erfordert eine entsprechende Denkweise,
                      Sorgfalt, Mißtrauen und vieles Andere. Dazu einiges
                      an Grundlagenwissen, etwa über Algorithmen und Daten-strukturen - dieses Wissen ist nicht an die Syntax
                      einer konkreten Programmiersprache gebunden.

                      Ich schreibe mal ein richtig gutes AnfängerBuch zum
                      Programmieren! Wo alles schön erklärt wird, so dass
                      man dann frei seiner Kreativität den Lauf lassen
                      kann... :-))

                      Es gibt eine Reihe von Programmiersprachen, die mit dem
                      erklärten Ziel, den Leuten das Programmieren beizubrin-
                      gen, erfunden wurden. Niklaus Wirth ist besonders be-
                      kannt geworden für solche Sprachen (u. a. Pascal und
                      Modula), die sich durch die Klarheit ihrer Anweisungs-
                      struktur, die Lesbarkeit der Programme und die frühe
                      Erkennbarkeit von Fehlern auszeichnen. Auch Eiffel
                      hätte meine Sympathie, von seinem Ansatz her.

                      Leider bedingt dies, daß bestimmte Dinge nicht funk-
                      tionieren können - die Lernbarkeit einer Sprache wird
                      nicht dadurch höher, daß jede Zeichenkette "irgendwas"
                      bedeutet, sondern eben dadurch, daß viele Zeichenketten
                      "nichts Gültiges" bedeuten (dann kann man sich die-
                      jenigen, die "etwas Gültiges" bedeuten, nämlich leich-
                      ter merken, wenn sie einer entsprechenden Systematik
                      unterliegen).

                      In der "Industrie" haben sich solche Sprachen aber
                      aufgrund ihrer inhärenten Einschränkungen nicht durch-
                      gesetzt. Die gängigen Sprachen sind m. E. alle nicht
                      besonders geeignet, damit Programmieren zu lernen;
                      der Aufwand, erst mal eine Lehrsprache zu lernen und
                      danach eine "richtige", wird von vielen Neulingen aber
                      nicht eingesehen. Dabei wäre das in der Tat die effi-
                      zientere Methode, weil man im Lauf der Zeit so viele
                      Sprachen lernen muß, daß es sinnvoll ist, den Lern-
                      prozeß als solchen zu optimieren und nicht den kurz-
                      fristigen Erfolg bei der ersten Sprache.

                      Viele Grüße
                      <img src="http://www.schroepl.net/projekte/gzip_cnc/gzip_cnc.gif" border=0 alt=""> Michael