Sven Jacobs: Typecasting?

Gibt es in Perl die Möglichkeit ihm explizit mitzuteilen, mit was für einem Wertetyp er rechnen soll?

Ich habe hier zwei Wert in einem Hash $hash{ 'a' } und $hash{ 'b' }. Wenn ich mir die Werte einzeln ausgebe, bekomme ich 12,2 und 12,8. Wenn ich die Werte jedoch voneinander subtrahiere, bekomme ich immer 0.

Woran kann das liegen?

  1. Hallo,

    Wenn ich mir die Werte einzeln ausgebe, bekomme ich 12,2 und 12,8. Wenn ich die Werte jedoch voneinander subtrahiere, bekomme ich immer 0.

    Wenn Du wirklich 12,2 und 12,8 als Werte ausgegebenbekommst und nicht 12.2 bzw. 12.8, dann sind das keine Zahlen mit Dezimalstellen. Perl versucht dann bei der Subtraktion beide Strings in Zahlen umzuwandeln, wobei alle Zeichen ab dem ersten nicht einer Zahl zuzuordnenden Zeichen (in diesem Falle also wahrscheinlich ',') ignoriert werden.

    Und nein, ein Typecasting gibt es in nicht. (wenn man von der Funktion int absieht, die so etwas ähnliches macht)

    Grüße
      Klaus

    1. Wenn Du wirklich 12,2 und 12,8 als Werte ausgegebenbekommst und nicht 12.2 bzw. 12.8, dann sind das keine Zahlen mit Dezimalstellen.

      Ja, bekomme ich.  Ich lese die Werte aus einer DB aus und bekomme sie so zurück. Offensichtlich arbeitet Perl an dieser Stelle wirklich mit Strings, das ist ein guter Tipp!

      Kann ich dem Perl denn irgendwie verständlich machen, dass es auch mit diesen Werten rechnen kann (use locales oder sowas)? Oder muss ich jetzt alle Kommas in Punkte umwandeln?

      1. Wenn Du wirklich 12,2 und 12,8 als Werte ausgegebenbekommst und nicht 12.2 bzw. 12.8, dann sind das keine Zahlen mit Dezimalstellen.
        Ja, bekomme ich.  Ich lese die Werte aus einer DB aus und bekomme sie so zurück.

        Dann ist Dein Feldtyp in der DB falsch.

        Gruß
        Reiner

      2. Tag Sven.

        Kann ich dem Perl denn irgendwie verständlich machen, dass es auch mit diesen Werten rechnen kann (use locales oder sowas)? Oder muss ich jetzt alle Kommas in Punkte umwandeln?

        Ersetze die Kommata durch Punkte und rechne dann weiter, Perl behandelt den String dann entsprechend als Zahl. Wenn du ganz sicher gehen willst, empfiehlt sich entweder die Verwendung der Funktion strtod() aus dem POSIX-Modul oder looks_like_number() aus Scalar::Util.

        Siechfred

        --
        «Ich liebe euch doch alle!»