hotti: Rätsel: Was geht hier schief?

hi,

der Fehler ist nicht gleich zu sehen, viel Spaß beim rätseln ;)

  
# Erstelle eine temporäre Datei mit "was drin"  
sub tempo{  
	my $fh = File::Temp->new;  
	# schreibe in Handler...  
        $fh->print("was drin"); # Beispiel  
	return $fh->filename;  
}  

Schönes Wochenende,
Hotti

--
Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  1. Moin,

    Erstelle eine temporäre Datei mit "was drin"

    sub tempo{
    my $fh = File::Temp->new;

    schreibe in Handler...

    $fh->print("was drin"); # Beispiel
    return $fh->filename;
    }

      
    Gut mach ich mal den Anfang:  
      
    Bin mir nicht sicher, aber liefert "new" nicht die Referenz auf die Methode (statt sie auszuführen, vgl. "new()") ? Sprich, ist $fh möglicherweise eine Konstruktor-Methode statt des File-Deskriptors, den man eigentlich gerne hätte?  
    
    
    1. hi,

      Gut mach ich mal den Anfang:

      Sehr schön, danke fürs mitmachen ;)

      Bin mir nicht sicher, aber liefert "new" nicht die Referenz auf die Methode (statt sie auszuführen, vgl. "new()") ? Sprich, ist $fh möglicherweise eine Konstruktor-Methode statt des File-Deskriptors, den man eigentlich gerne hätte?

      Es wäre Beides richtig:

        
      my  $fh = File::Temp->new;  
      my  $fh = File::Temp->new();  
      
      

      Der Fehler liegt woanders, Tipp: Es ist ein systematischer Fehler.

      Hotti

      1. Moin,

        Der Fehler liegt woanders, Tipp: Es ist ein systematischer Fehler.

        Dann fiele mir nur noch ein, dass der Fehler, dass keine temporäre Datei angelegt wird, nicht abgefangen wird und dass man die Referenz auf die Datei verliert, wenn die Funktion verlassen wird, sprich man kann das Filehandle nicht mehr aktiv schliessen oder darauf schreiben/davon lesen.

        Wären aber beides keine echten "Fehler" sondern nur ggf. etwas unsauber - hängt von dem Rest der Software ab, ob das ein ernsthaftes Problem wäre.
        Ich vermute daher, Du willst auf was anderes raus. Na ich bin mal gespannt... :)

        1. Hallo,

          Der Fehler liegt woanders, Tipp: Es ist ein systematischer Fehler.
          Dann fiele mir nur noch ein, dass der Fehler, dass keine temporäre Datei angelegt wird, nicht abgefangen wird und dass man die Referenz auf die Datei verliert, wenn die Funktion verlassen wird, sprich man kann das Filehandle nicht mehr aktiv schliessen oder darauf schreiben/davon lesen.

          Du hast es ;)

          Im Detail: Die Datei wird mit File::Temp angelegt und ins Handle werden Daten geschrieben. Beim return jedoch passiert dann das Missgeschick: Über das Handle wird zwar noch der Dateiname ermittelt, aber das Handle wird mit dem Verlassen der Subfunktion geschlossen. Zum zurückgegebenen Dateinamen gibt es in fakt keine Datei!

          Wären aber beides keine echten "Fehler" sondern nur ggf. etwas unsauber

          Es geht voll in die Hose ;)

          Selbst beim Testen

            
          my $filename = tempo(); # siehe weiter oben  
          File::Copy::copy($filename, "/tmp/foo") or warn $!; # No such file...  
          
          

          hats bei mit nicht gleich geklingelt ;)

          Lösung: Die Funktion tempo() gibt das Handle selbst zurück, damit bleibt dies am Leben. File::Copy::copy() kann auch aus einem Handle kopieren, es muss jedoch vorher ein seek(0,0) gemacht werden (zweckmäßig gleich in der subfunction).

          Schönen Abend,
          Hotti

    2. Moin Moin!

      Bin mir nicht sicher, aber liefert "new" nicht die Referenz auf die Methode (statt sie auszuführen, vgl. "new()") ? Sprich, ist $fh möglicherweise eine Konstruktor-Methode statt des File-Deskriptors, den man eigentlich gerne hätte?

      Nö, das wäre Javascript. Die Klammern sind hier tatsächlich optional, aber sehr empfohlen. Um an eine Referenz auf die Methode zu kommen, müßte man die can-Methode aufrufen, z.B. als my $mref=File::Temp->can('new');. Wenn man *weiß*, dass die Methode direkt in der Klasse implementiert ist (und nicht geerbt ist), kann man sich auch mit my $mref=\&File::Temp::new; behelfen. Das ist aber alles andere als sauber, weil man solche Implementationsdetails nach der reinen Lehre nicht wissen darf.

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".