subi: Umsetzung eines Konsolenskripts: Hilfeeee!

Hallo allerseits,

ich stehe als Perl-Newbie vor dem folgenden Problem:

Dieses Konsolenskript soll in eine CGI-Variante umgesetzt werden:

---------
#!usr/bin/perl
print "Geben Sie den umzurechnenden Betrag ein:\n";
$input1= <STDIN>;
chomp ($input1);
$input1 =~ tr/,/./;
$input =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
print "Waehlen Sie bitte eine Option aus:\n";
print "DM zu EUR (1)\n";
print "EUR zu DM (2)\n";
$input2 = <STDIN>;
chomp ($input2);
$EUR = $input1/1.95583;
$DM = $input1*1.95583;
$EURFormatiert = sprintf("%.2f", $EUR);
$DMFormatiert = sprintf("%.2f", $DM);
if ($input2 == 1)
 {
 print "$input1 DM sind $EURFormatiert EUR\n";
 }
elsif ($input2 == 2)
 {
  print "$input1 EUR sind $DMFormatiert DM\n";
 }
else
 {
 print "Die Option $input2 existiert nicht!\n";
 }
-------------

Das Problem liegt jetzt darin, den zu umzurechnenden Betrag nicht über die Konsole, sondern über ein HTML-Formular mit Radiobuttons einzugeben.

Also: Eingabe über Formular ---> CGI-Skript ---> Ausgabe in HTML

Ich habe als Perl-Newbie überhaupt keine Ahnung, wie das zu realisieren ist.

MfG

  1. Hey,
    du hast die Dokumentation nicht gelesen, weder Selfhtml noch Perldoc. Hole dies bitte jetzt nach. http://search.cpan.org/dist/CGI.pm/CGI.pm#FETCHING_THE_VALUE_OR_VALUES_OF_A_SINGLE_NAMED_PARAMETER:

    --
    水-金-地-火-木-土-天-海-冥
    1. Danke für den Hinweis,

      das würde aber mein Problem nicht lösen. Von Programmiersprachen habe ich leider wenig Ahnung. Darum habe ich hier um Hilfeeee geschrien!

      MfG

      1. Schönen guten Abend,

        das würde aber mein Problem nicht lösen.

        Warum? Vielleicht wegen der Anmerkung, die als nächstes kommt?

        Von Programmiersprachen habe ich leider wenig Ahnung.

        Um das zu ändern bist du doch hier? Was, genau, verstehst du an dem verlinkten Dokument nicht?

        Du wirst hier Hilfe zur Selbsthilfe erhalten; will heissen: Die Leute hier zeigen dir das nächste Stück des Wegs und helfen dir, zeitraubende Nebenwege zu vermeiden. Gehen musst du selbst. Und du musst eben lernen, die Landkarten zu lesen.

        Darum habe ich hier um Hilfeeee geschrien!

        Ja, das ist noch so ein Punkt: Geschrei kommt überhaupt nicht gut an. Atme tief durch, setz' dich auf deinen Hosenboden, lies, probiere aus. Anders geht's (nicht nur hier) nicht.

        File Griese,

        Stonie

        --
        Ein schlechtes Statement spricht für sich - jeder Kommentar ist verschwendete Energie, die einem bei wirklich wichtigen Unterfangen fehlen könnte.
        Und im Übrigen kennt auch Stonie Wayne.
        1. Hallo Stonie,

          es ist mir klar, dass ich meine eigenen Weg gehen muss und ich habe nicht um eine komplette Lösung geschrien, sondern nur um einen kleinen Hinweis, um den Anfang zu machen. Ich arbeite jetzt aus reinem Neugier seit 4 Stunden an dieses Problem und versuche natürlich mit meinem sehr begrenzten Programmierwissen, das hinzukriegen. Vielleicht bin ich hier als absoluter Newbie am falschen Ort. Ich werde mein Glück woanders versuchen.

          Danke euch allen, auch wenn ich hier keine konkrete Hilfe gefunden habe!

          subi

          1. Hi subi,

            tja, schade, dass du nicht sagst, wo du genau stecken bleibst. Skeeve hat's ja auch versucht und würde dir sicherlich auch weiterhelfen. Im falschen Forum bist du sicher nicht, du musst nur genauer beschreiben, wo's denn hängt.

            File Griese,

            Stonie

            --
            Ein schlechtes Statement spricht für sich - jeder Kommentar ist verschwendete Energie, die einem bei wirklich wichtigen Unterfangen fehlen könnte.
            Und im Übrigen kennt auch Stonie Wayne.
  2. Moin!

    Riecht nach Hausaufgabe!

    Bau Dir doch erstmal das Eingabeformular. Damit hast du dann schon mal einen Teil hiervon umgesetzt:

    #!usr/bin/perl
    print "Geben Sie den umzurechnenden Betrag ein:\n";
    $input1= <STDIN>;
    chomp ($input1);
    $input1 =~ tr/,/./;
    $input =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    print "Waehlen Sie bitte eine Option aus:\n";
    print "DM zu EUR (1)\n";
    print "EUR zu DM (2)\n";
    $input2 = <STDIN>;
    chomp ($input2);

    Dann schau dir auf den bereits genannten Seiten an, wie diese Daten, aus Deinem Eingabeformluar beim Server ankommen, d.h., wie man darauf zugreift, von perl aus. Damit hast Du dann den fehlenden Teil von obigem umgestzt.

    Anschließend wandelst Du diesen Teil hier passend ab, da wahrscheinlich die Variablennamen andere sein werden:

    $EUR = $input1/1.95583;
    $DM = $input1*1.95583;
    $EURFormatiert = sprintf("%.2f", $EUR);
    $DMFormatiert = sprintf("%.2f", $DM);

    Als letztes mußt Du noch diesen Teil hier in HTML und print Befehle umbauen:

    if ($input2 == 1)
    {
    print "$input1 DM sind $EURFormatiert EUR\n";
    }
    elsif ($input2 == 2)
    {
      print "$input1 EUR sind $DMFormatiert DM\n";
    }
    else
    {
    print "Die Option $input2 existiert nicht!\n";
    }

    -- Skeeve

    1. Hallo Skeeve,

      jetzt fange ich an durchzublicken. So ein Hinweis hätte uns vielleicht die ganze Diskussion hier erspart. Ich danke Dir für die konkrete Hilfestellung. Jetzt mache ich mich an die Arbeit.

      MfG

      1. Hallo Skeeve,

        den ersten Schritt habe ich jetzt gemacht. Es müssen aber weitere noch folgen. Ich habe immer noch Probleme:

        Hier ist das HTML-Formular:

        ----------------
        <form action="/cgi-bin/umrechner.pl" method="post">
          <p>Geben Sie bitte den umzurechnenden Betrag ein:</p>
          <p>
            <input name="betrag" type="text" id="betrag">
        </p>
          <p>W&auml;hlen Sie bitte eine Option aus:</p>
          <p>
            <input type="radio" name="button1" value="radiobutton">
          DM zu EUR</p>
          <p>
             <input type="radio" name="button2" value="radiobutton">
             EUR zu DM</p>
          <p>
            <input type="submit" name="Submit" value="Umrechnen">
          </p>
        </form>
        ----------------

        calculator.pl
        ---------------

        #!usr/bin/perl
        read(STDIN, my $Daten, $ENV{'CONTENT_LENGTH'});
        my @Formularfelder = split(/&/, $Daten);
        my ($Feld, $Name, $Wert);
        my %Formular;
        foreach $Feld (@Formularfelder) {
         (my $Name, $Wert) = split(/=/, $Feld);
        $betrag =~ tr/,/./;
        $EUR = $betrag/1.95583;
        $DM = $betrag*1.95583;
        $auswahl;
          if($auswahl == $Formular{button1}) {
            print "<p>$EUR</p>\n";
          }
          elsif ($auswahl == $Formular{button2}) {
           print "<p>$DM</p>\n";
          }
          else {
          print "<p>Die Option $auswahl existiert nicht!</p>\n";
          }
        --------

        Was mache ich hier falsch? Es kommt immer eine Fehlermeldung!

        1. Hi subi,

          <form action="/cgi-bin/umrechner.pl" method="post">

          calculator.pl

          Du lässt die Formulardaten an umrechner.pl verschicken, nennst dein Perl Script aber calculator.pl - nur ein Tipfehler? Falls nicht, musst du das natürlich korrigieren ;-)

          Was mache ich hier falsch? Es kommt immer eine Fehlermeldung!

          Dann sei doch bitte so nett und nenne uns die Fehlermeldung auch ;-) Aber bitte nicht nur das was im Browser angezeigt wird (dürfte in diesem Fall Internal Server Error sein), sondern auch das, was in der error.log steht.

          In diesem Fall ist der Fehler jedoch offensichtlich - wenn du mit Perl Daten an den Besucher schicken willst, dann musst du dich auch um die HTTP Kommunikation kümmern, sprich dein Script muss bevor *irgend eine* Ausgabe erfolgt, die zwigend notwendigen HTTP Header schicken:

          print "Content-Type: text/html\r\n";  
          print "\r\n";
          

          Und erst anschließend kannst du andere Ausgaben an den Server schicken. Zum Testen reicht dein <p>Text</p> natürlich, aber wenn du dein Script wirklich nutzen willst, beachte bitte, dass du ein komplettes HTML-Dokument schicken musst, also:

          print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n";  
          print "<html>\n";  
          // usw.
          

          Viele Grüße aus Kanada,
            ~ Dennis.

          1. Hi Dennis,

            Das Skript heißt doch (umrechner.pl). Ich habe mich bei der Beschreibung nur verschrieben!

            MfG

        2. den ersten Schritt habe ich jetzt gemacht. Es müssen aber weitere noch folgen.

          Ja, vor allem hättest du den Hinweis auf das CGI Modul lesen sollen. Das ist für CGI Anwendungen das A&O (bis zu einer gewissen Größe) und bietet alles an Funktionen die du brauchst.

          Mit dem Modul sähe deine Anwendung in etwa so aus (inkl Formularausgabe):

          #! /usr/bin/perl -w  
          use strict;  
          use CGI;  
          use CGI::Carp qw(fatalsToBrowser warningsToBrowser);  
          print CGI::header();  
          print CGI::start_html();  
            
          if( CGI::param('submit') )  
          {  
               my $betrag = CGI::param('betrag') || 0;  
               my $wahl = CGI::param('button');  
               $betrag =~ tr/,/./;  
               my $ausgabe = $wahl eq 'DM2EUR' ? $betrag / 1.95583 : $betrag * 1.95583;  
               my $einheit_vorher = $wahl ne 'DM2EUR' ? 'EUR' : 'DM';  
               my $einheit_nacher  = $wahl eq 'DM2EUR' ? 'EUR' : 'DM';  
               print CGI::p( sprintf '%.2f %s sind %.2f %s', $betrag, $einheit_vorher, $ausgabe, $einheit_nacher);  
          }  
          print formular();  
          print CGI::end_html();  
            
          sub formular  
          {  
              return CGI::start_form()  
              . CGI::p( 'Geben Sie bitte den umzurechnenden Betrag ein:')  
              . CGI::p( CGI::textfield( -name => "betrag") )  
              . CGI::p('Wählen Sie bitte eine Option aus:')  
              . CGI::radio_group(-name => 'button', -labels => { 'DM2EUR' => 'DM zu EUR', 'EUR2DM' => 'EUR zu DM'},  
              -values => [ 'DM2EUR', 'EUR2DM' ]  
              )  
              . CGI::p( CGI::submit( -name => 'submit', -value => 'Umrechnen') )  
              . CGI::end_form()  
              ;  
          }  
          
          

          Struppi.

          --
          Javascript ist toll (Perl auch!)