perlnewbie: Mini-Programm in Perl geschrieben, eine Frage

Hallo!
Ich habe heute mal ein Programm in Perl geschrieben, was folgendes tun soll: Es soll zuerst fragen "Wie ist dein Name?". Nachdem man seinen Namen eingegeben hat, soll es "Hallo (name), wie geht's dir?" fragen. Soweit funktioniert es auch. Aber das ist noch nicht das ganze Programm. Denn je nachdem, ob man die Frage mit "gut" oder "schlecht" beantwortet, soll das Programm unterschiedlich Antworten.

Ich glaube sogar, dass es funktionieren würde, doch ich habe leider das Problem, dass wenn ich auf die zweite Frage "Hallo (name), wie geht's dir?" antworten möchte, sich das Programm schließt. Wie kann ich das verhindern?

Hier das Skript/Script:

#!/usr/bin/perl
use 5.010;
use warnings FATAL => 'all';

say "Wie ist Dein Name? ";
my $name = <STDIN>;
say "Hallo $name, wie geht's Dir?";
$antwort1 = "gut";
$antwort2 = "schlecht";
if ($antwort1)  {
   # say "schön zu hören";
}
  if ($antwort2)  {
   # say "warum?"
 }

Vielleicht könnt ihr mir ja helfen. Danke schon mal im Voraus.

L.G. perlnewbie :)

  1. Tach!

    Ich glaube sogar, dass es funktionieren würde, doch ich habe leider das Problem, dass wenn ich auf die zweite Frage "Hallo (name), wie geht's dir?" antworten möchte, sich das Programm schließt. Wie kann ich das verhindern?

    Du hast da ja auch nichts stehen, was eine Eingabe entgegennimmt. Außerdem haben wir einen Themenbereich PERL, der passt besser zu deinen Fragen.

    dedlfix.

    1. Tach!

      Ich glaube sogar, dass es funktionieren würde, doch ich habe leider das Problem, dass wenn ich auf die zweite Frage "Hallo (name), wie geht's dir?" antworten möchte, sich das Programm schließt. Wie kann ich das verhindern?

      Du hast da ja auch nichts stehen, was eine Eingabe entgegennimmt. Außerdem haben wir einen Themenbereich PERL, der passt besser zu deinen Fragen.

      dedlfix.

      Erstmal danke für deine ANtwort Dedlfix. Sry dass ich es nicht im Perl-Bereich gepostet habe, mach ich ab jetzt. Was soll da denn stehen, was eine eingabe entgegen nimmt? Tut mir leid, bin aber wirklich völliger Anfänger, und versuche auch nicht allzu viele dumme Fragen zu stellen.

      1. Tach!

        Was soll da denn stehen, was eine eingabe entgegen nimmt? Tut mir leid, bin aber wirklich völliger Anfänger, und versuche auch nicht allzu viele dumme Fragen zu stellen.

        Auch als Programmieranfänger muss man ein kleines Bisschen Logik mitbringen. Wenn du vom Benutzer eine Eingabe entgegennehmen willst, muss du das in entsprechendem Code ausdrücken veranstalten. Von allein hopst die nicht in eine Variable. Und außerdem hast du das ja beim Namen schon gemacht. Du solltest das also bereits können.

        Und dann hast du sowas:

        if ($antwort1)

        Du möchtest die Eingabe, die du noch nicht entgegengenommen hast, mit dem Wert in $antwort1 vergleichen. Stattdessen bewirkt das Konstrukt, dass der Inhalt von $antwort1 im booleschen Kontext ausgewertet wird. Das heißt, er wird nach Boolean konvertiert und ergibt immer true. it (true) hätte dieselbe Wirkung (wenn Perl true kennen würde). Du musst also, nachdem du die Eingabe in irgendeiner Variable stehen hast, sie mit $antwort1 und $antwort2 vergleichen, um zu einem sinnvollen Bedingungsausdruck zu kommen.

        dedlfix.

        1. Tach!

          Was soll da denn stehen, was eine eingabe entgegen nimmt? Tut mir leid, bin aber wirklich völliger Anfänger, und versuche auch nicht allzu viele dumme Fragen zu stellen.

          Auch als Programmieranfänger muss man ein kleines Bisschen Logik mitbringen. Wenn du vom Benutzer eine Eingabe entgegennehmen willst, muss du das in entsprechendem Code ausdrücken veranstalten. Von allein hopst die nicht in eine Variable. Und außerdem hast du das ja beim Namen schon gemacht. Du solltest das also bereits können.

          Und dann hast du sowas:

          if ($antwort1)

          Du möchtest die Eingabe, die du noch nicht entgegengenommen hast, mit dem Wert in $antwort1 vergleichen. Stattdessen bewirkt das Konstrukt, dass der Inhalt von $antwort1 im booleschen Kontext ausgewertet wird. Das heißt, er wird nach Boolean konvertiert und ergibt immer true. it (true) hätte dieselbe Wirkung (wenn Perl true kennen würde). Du musst also, nachdem du die Eingabe in irgendeiner Variable stehen hast, sie mit $antwort1 und $antwort2 vergleichen, um zu einem sinnvollen Bedingungsausdruck zu kommen.

          dedlfix.

          So sieht mein Skript jetzt aus:

          #!/usr/bin/perl
          use 5.010;
          use warnings FATAL => 'all';

          say "Wie ist Dein Name? ";
          my $name = <STDIN>;
          say "Hallo $name, wie geht's Dir?";
          $antwort1 = <STDIN>;
          $antwort2 = <STDIN>;
          $antwort1 = "gut";
          $antwort2 = "schlecht";
          if ($antwort1)  {
             # say "schön zu hören";
          }
            if ($antwort2)  {
             # say "warum?"
          }

          Diesmal liegt das Problem darin, dass $antwort1 & $antwort2 jeweils zwei Zuweisungen bekommen haben, oder? Also z.B. kann $antwort1 ja nicht gleichzeitig <STDIN> & "gut" sein, oder?

          Ist jetzt nicht ganz so wichtig, dass einer antwortet. Wer mag kann gerne helfen. Ich erwarte von euch gar nichts, erst recht nicht mehr heute, ist ja schon recht spät.

          Also ich schaue es mir nochmal an, und vielleicht komme ich von selbst drauf. Oder es steht irgendwo mal sehen...

          L.G. perlnewbie

          1. $antwort1 = <STDIN>;
            $antwort2 = <STDIN>;
            $antwort1 = "gut";
            $antwort2 = "schlecht";
            if ($antwort1)  {
               # say "schön zu hören";
            }
              if ($antwort2)  {
               # say "warum?"
            }

            Schau dir mal an was du da machst.
            Du lässt den Benutzer zwei Antworten eingeben. Warum zwei? Die merkst du dir in verschiedenen Variablen.
            Als nächstes überschreibst du die Antworten in den Variablen gleich wieder durch feste Werte. Die vom Benutzer eingegebenen sind also weg.

            Dann machst du wie bereits angesprochen einen Test "Wenn gut". Damit kann Perl nichts anfangen. Es wird zu "wahr" ausgewertet, denn der Wert "gut" ist nicht leer.
            Sagst du "wenn Sonne" dann Fenster auf? Oder sagst du "wenn die Sonne scheint"?
            Da gehört ein Vergleich hin, ich glaub in Perl geht das so: if ($antwort1 eq "gut") ...

            1. Schau dir mal an was du da machst.
              Du lässt den Benutzer zwei Antworten eingeben. Warum zwei? Die merkst du dir in verschiedenen Variablen.
              Als nächstes überschreibst du die Antworten in den Variablen gleich wieder durch feste Werte. Die vom Benutzer eingegebenen sind also weg.

              Dann machst du wie bereits angesprochen einen Test "Wenn gut". Damit kann Perl nichts anfangen. Es wird zu "wahr" ausgewertet, denn der Wert "gut" ist nicht leer.
              Sagst du "wenn Sonne" dann Fenster auf? Oder sagst du "wenn die Sonne scheint"?
              Da gehört ein Vergleich hin, ich glaub in Perl geht das so: if ($antwort1 eq "gut") ...

              Danke für deine Hilfe. Ich habe es so gemacht, wie du es beschrieben hast, aber es funktioniert noch nicht ganz. Ich werde jetzt einfach nochmal die wichtigsten Sachen über Perl gründlich durchlesen und es selbst versuchen, bevor ich wieder mit meinen dummen Fragen nerve.

              LG perlnewbie

  2. hi,

    use warnings FATAL => 'all';

    Ok, gut, gelernt von CPAN ;)

    wo ist:
    use strict;
       ???

    Horst

  3. ich würde dir gerne http://perl-tutorial.org/ empfehlen. da gibt's zum beispiel "Modern Perl - The Book". dort bekommst du auch beigebracht, wie du von anfang an mit use strict arbeitest. das sind alles tutorials, die bestimmten modernen kriterien entsprechen.

    ein ansatz:

    chomp(my $antwort = <STDIN>);  
      
    # oder ausführlicher  
    my $antwort = <STDIN>;  
    chomp $antwort; # entfernt zeilenumbruch
    

    jetzt musst du $antwort noch mit deinen erwarteten antworten vergleichen, mit dem string-vergleichs-operator "eq".
    denke auch dran, was passieren soll, wenn keine der beiden erwarteten antworten eingegeben wird.

  4. Om nah hoo pez nyeetz, perlnewbie!

    Ich gehe davon aus, dass du mit dem Stringterminator-perlnewbie identisch bist:

    In jenem Thread hast du dich eigentlich recht gut an die Antwort-Gepflogenheiten gehalten, bitte bleib bei diesem Stil und vermeide zukünftig wieder Vollzitate. Sie stören nur den Lesefluss.

    Matthias

    --
    Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Yak und Yakari.