Stefan Welscher: Filehandler an Unterfunktion übergeben?

Hallo,
ich habe ein Programm in dem ich einen Filehandler an eine Unterfunktion übergeben muss. Leider hab ich das bisher noch nicht hinbekommen. Bisher sieht das ganzewie folgt aus (funzt aber eben nicht):

  
sub constructor1 ()  
{  
   $FILE=$_[1];  
   print $FILE "2nd line\n";  
}  
  
  
open (FILE, ">",$filename);  
  
print FILE "1st line\n";  
constructor1 (<FILE>);  
  
close (FILE);  

Wie kann ich den Filehandler richtig übergeben?

Danke!

  1. Hallo,

    das geht viel einfacher, als Du denkst:

    sub constructor1 ()
    {
       $bla = "2nd line\n";
       return $bla;
    }

    open (FILE, ">",$filename);
    print FILE "1st line\n";
    print FILE constructor1();
    close (FILE);

    Gruß Markus

    --
    alles wird gut...
    1. das geht viel einfacher, als Du denkst:

      sub constructor1 ()
      {
         $bla = "2nd line\n";
         return $bla;
      }

      open (FILE, ">",$filename);
      print FILE "1st line\n";
      print FILE constructor1();
      close (FILE);

      OK, das ist natürlich eine brauchbare, einfache Lösung :)

      Aber rein in der Theorie... ist es dann überhaupt möglich Filehandles zu übergeben?

      Danke!

  2. ich habe ein Programm in dem ich einen Filehandler an eine Unterfunktion übergeben muss. Leider hab ich das bisher noch nicht hinbekommen. Bisher sieht das ganzewie folgt aus (funzt aber eben nicht):

    In deinem Beipsiel sind eine ganze Menge Fehler und unaufmerksamkeiten.

    sub constructor1 ()
    {
       $FILE=$_[1];

    Du arbeitest nicht mit use strict?
    Warum willst du hier den zweiten Parameter?
    und die Variabel hiesse vielleicht besser FH (Filehandle)

    print $FILE "2nd line\n";
    }

    open (FILE, ">",$filename);

    Warum prüfst du nicht ob es wirklich klappt die Datei zu öffnen?

    print FILE "1st line\n";
    constructor1 (<FILE>);

    wie kommst du darauf, dass wenn du eine Zeile aus der Datei an die Funktion übergibst, du dann den Filehandle hast?

    Wie kann ich den Filehandler richtig übergeben?

    z.b. so:
    [code lang=perl]#!/usr/bin/perl -w
    use strict;

    my $filename = "test.txt";
    open FILE, ">$filename" or die "Fehler beim öffnen: $!";

    print FILE "1st line\n";
    constructor1 (*FILE);

    close FILE;

    sub constructor1
    {
       my $FH = shift || return;
       print $FH "2nd line\n";
    }

    Struppi.
    
    -- 
    [Javascript ist toll](http://javascript.jstruebig.de/)
    
    1. Hi Struppi!

      #!/usr/bin/perl -w

      use strict;

      my $filename = "test.txt";
      open FILE, ">$filename" or die "Fehler beim öffnen: $!";

      print FILE "1st line\n";
      constructor1 (*FILE);

      close FILE;

      sub constructor1
      {
         my $FH = shift || return;
         print $FH "2nd line\n";
      }

        
      Ich kenne mich mit Perl nicht aus, aber woher weiß denn die Funktion constructor1, dass $FH der Filehandler von FILE ist?  
        
      MfG H☼psel
      
      -- 
      "It's amazing I won. I was running against peace, prosperity, and incumbency."  
      George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001  
        
      [Selfcode](http://community.de.selfhtml.org/fanprojekte/selfcode.htm): ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
      
      1. Ich kenne mich mit Perl nicht aus, aber woher weiß denn die Funktion constructor1, dass $FH der Filehandler von FILE ist?

        Weil es ein Typeglob ist, sieh Siechfreds Antwort.

        Struppi.

    2. In deinem Beipsiel sind eine ganze Menge Fehler und unaufmerksamkeiten.

      Du arbeitest nicht mit use strict?

      nein...

      Warum willst du hier den zweiten Parameter?

      flüchtigkeitsfehler.. das hier ist ja auch nur beispielcode...

      und die Variabel hiesse vielleicht besser FH (Filehandle)

      Da muss ich dauernd an Fachhochschule denken... mir gefällt FILE besser ;)

      Warum prüfst du nicht ob es wirklich klappt die Datei zu öffnen?

      Wie gesagt... nur Beispielcode hier!

      print FILE "1st line\n";
      constructor1 (<FILE>);

      wie kommst du darauf, dass wenn du eine Zeile aus der Datei an die Funktion übergibst, du dann den Filehandle hast?

      ich hab halt experimentiert ;)

      Wie kann ich den Filehandler richtig übergeben?

      z.b. so:

      #!/usr/bin/perl -w

      use strict;

      my $filename = "test.txt";
      open FILE, ">$filename" or die "Fehler beim öffnen: $!";

      print FILE "1st line\n";
      constructor1 (*FILE);

      close FILE;

      sub constructor1
      {
         my $FH = shift || return;
         print $FH "2nd line\n";
      }

      
      > Struppi.  
        
        
      Klingt super - Danke!
      
      1. Du arbeitest nicht mit use strict?
        nein...

        Mit use strict und Warnungen wäre dir zumindest der Flüchtigkeitsfehler schon aufgefallen.

        print FILE "1st line\n";
        constructor1 (<FILE>);

        wie kommst du darauf, dass wenn du eine Zeile aus der Datei an die Funktion übergibst, du dann den Filehandle hast?
        ich hab halt experimentiert ;)

        Die Doku kennst du aber?
        perldoc wird eigentlich immer mitinstalliert.
        Nachlesen ist manchmal schneller und erfolgreicher, als experimentieren.

        Struppi.

        1. Mit use strict und Warnungen wäre dir zumindest der Flüchtigkeitsfehler schon aufgefallen.

          print FILE "1st line\n";
          constructor1 (<FILE>);

          wie kommst du darauf, dass wenn du eine Zeile aus der Datei an die Funktion übergibst, du dann den Filehandle hast?
          ich hab halt experimentiert ;)

          Die Doku kennst du aber?
          perldoc wird eigentlich immer mitinstalliert.
          Nachlesen ist manchmal schneller und erfolgreicher, als experimentieren.

          Struppi.

          Hallo nochmal,
          also so richtig sagt mir perldoc nichts...
          Allerdings hab ich schon ne Datei gefunden, die sich so nennt und auche exec ist. Nur muss ich da erstmal kucken, wie das überhaupt funktioniert... werd ich aber demnächst mal ausprobieren.

          Ich würde aber jetzt dennoch gerne nochmal auf den vorherigen Code zurückkommen, da ich die Übergabe einfach nicht so gebacken bekomme, wie ich es gern hätte.
          Also ich hab inzwischen folgenden (Orginal-)Code:

            
          #Sub from final.pm  
          ...  
          sub conf_pe_final  
          {  
           my ($I, $OUTPUT)=@_;  
           my %CE=$I->{'ce'}; my %PE=$I->{'pe'};  
            
           print $OUTPUT "This is a configuration";  
          }  
          ...  
            
          #Main file  
          ...  
          #Build Final-Config  
          open (OUTPUT, ">", $output_file."_pe_final");  
          $return=&conf_pe_final(%I,*OUTPUT);  
          close (OUTPUT);  
          ...  
          
          

          PERl meldet hier:
          Not a GLOB reference at /home/ipc/configurator/lib/final.pm line 16, <INPUT> line 2.

          Also meckert die Zeile mit dem print an...
          Woran kann liegt das jetzt? Das ich das "shift" nicht verwendet habe? Allerdings weiß ich nicht, wie ich das hier einbinden kann, soll etc :/

          1. also so richtig sagt mir perldoc nichts...

            Bei der Activstate Perl Version ist auch eine HMTL Doku dabei, die müßte sogar von deinem Startmenü aus erreichbar sein (falls du mit Windows arbeitest)

            wie's unter Linux aussieht weiß ich nicht, aber auch online gibt's perldoc
            http://aspn.activestate.com/ASPN/docs/ActivePerl/5.8/lib/Pod/perl.html

            PERl meldet hier:
            Not a GLOB reference at /home/ipc/configurator/lib/final.pm line 16, <INPUT> line 2.

            Du verwendest immer noch nicht use strict und die Warnungen hast du auch nicht eingeschaltet. So kannst du lange nach Fehlern suchen.

            Struppi.

  3. Hell-O!

    Wie kann ich den Filehandler richtig übergeben?

    Wie das gehen kann, hat dir Struppi ja schon geschrieben, bleibt mir nur, der Vollständigkeit halber auf perlref, dort "Making References reference, creation referencing", Punkt 7, und auf perldata hinzuweisen.

    Siechfred