Stefan Welscher: Referenz auf Referenz auf Hash/Filehandler übergeben?

Hallo Community,
ich versuch gerade in PERL eine Referenz durch mehrere Funktionen durchzuschleusen, kenn mich aber leider noch nicht so genau mit dem Thema aus.....

Also ich habe im Hauptprogramm ein Hash %I und einen Filehandler OUTPUT, welche ich dann an eine Funktion in einem anderen Modul als Referenz übergebe. Diese Funktion muss allerdings auch wieder die Möglichkeit haben, die Referenzen an eine andere Funktion weiterzureichen.
Bisher sieht das ganze bei mir so aus:

#Hauptscript:
...
open (OUTPUT ">", $output_file);
my $return=&conf_pe(%I, *OUTPUT, 'initial');
...

#Modul1:
sub conf_pe
{
   my ($HI, $OUTPUT, $conftype)=@_;
   my $return=0;

if ($conftype eq "initial")
   { $return=conf_initial_pe{%I, *OUTPUT}; }
   ...

return $return;
}

#Modul2
sub conf_initial_pe
{
   my ($HI, $OUTPUT)=@_;
   my $I=%{$HI};

my %O=get_pe_config($I{'ce'});
   print $OUTPUT $O{'header'}
   ....

return 1;
}

Das Problem ist jetzt, dass die Dateien leer bleiben...
Vermutlich wegen dem Filehandler, aber das Hash kann ich auch nicht ausschließen.
Sieht einer den Fehler :D ?

Danke!!!

  1. Hallo,

    use strict;
    use warnings;

      
    
    > open (OUTPUT ">", $output_file);  
    
      # obige zeile funktionert bei mir nicht -> syntaxfehler ?!  
      open (OUTPUT, ">".$output_file) or die $!;  
      
    
    >    { $return=conf_initial_pe{\%I, *OUTPUT}; }  
    
      # äh, was soll das sein?  
    
    

    Das Problem ist jetzt, dass die Dateien leer bleiben...

    Einfache Sachen testen, vielleicht mal Doku lesen.

      
    #!/usr/bin/perl  
      
    use strict;  
    use warnings;  
      
    sub doIt($)  
    {  
      my $fh = shift;  
      print $fh "string";  
    }  
      
    open (OUTPUT, ">file") or die $!;  
    doIt(OUTPUT);  
    close(OUTPUT);  
    
    

    gruss

    --
    Swiss Army Chainsaw
    Terrorific!
    VI VI VI - the editor of the beast!
  2. Hell-O!

    open (OUTPUT ">", $output_file);

    Nur zur Info an Eternius: Das ist die Syntax von Perl 5.8, niedrigere Versionen unterstützen diese Schreibweise m.E. noch nicht.

    my $return=&conf_pe(%I, *OUTPUT, 'initial');

    Das sollte so funktionieren. Aber bist du dir sicher, dass du dem Funktionsaufruf das '&' voranstellen möchtest (siehe perlsub)?

    #Modul1:
    sub conf_pe
    {
       my ($HI, $OUTPUT, $conftype)=@_;
       my $return=0;

    if ($conftype eq "initial")
       { $return=conf_initial_pe{%I, *OUTPUT}; }
       ...

    return $return;
    }

    Warum hier nochmal die Prüfung? Rufe doch gleich conf_initial_pe auf, ohne den Umweg über conf_pe. Ansonsten wäre das Durchschleifen der Hash- und Filehandle-Referenz völlig überflüssig. Der Subroutine die Argumente in geschweiften Klammern zu übergeben, habe ich so noch nicht gesehen, ich kenne eigentlich nur den Aufruf mit runden Klammern.

    #Modul2
    sub conf_initial_pe
    {
       my ($HI, $OUTPUT)=@_;
       my $I=%{$HI};

    Warum kopierst du die Hashreferenz wieder zurück in einen Hash, statt die Referenz weiter zu nutzen?

    my %O=get_pe_config($I{'ce'});

    Hier sollte es folgender Code auch tun:

    my %O=get_pe_config($$HI{'ce'});

    Sieht einer den Fehler :D ?

    Nein, nicht direkt, aber die möglichen Fehlerquellen, die mir aufgefallen sind, habe ich genannt. Vielleicht hilft's dir ja.

    Siechfred

    --
    Hier könnte Ihre Werbung stehen.
    Viel Lärm um nichts || Die neue 1%-Regelung
    1. Hi,

      open (OUTPUT ">", $output_file);

      Nur zur Info an Eternius: Das ist die Syntax von Perl 5.8, niedrigere Versionen unterstützen diese Schreibweise m.E. noch nicht.

      danke, aber bei aller liebe gibt das bei meiner version nen syntax fehler :( (hättest du vielleicht einen link parat?)

      Summary of my perl5 (revision 5 version 8 subversion 8) configuration:
        Platform:
          osname=freebsd, osvers=6.1-release, archname=i386-freebsd-64int
          uname='freebsd freebsd.org 6.1-release freebsd 6.1-release #0: wed mar 15 00:45:26 pst 2006 kris@freebsd.org:usrsrcsysmagickernelpath i386 '
          config_args='-sde -Dprefix=/usr/local -Darchlib=/usr/local/lib/perl5/5.8.8/mach -Dprivlib=/usr/local/lib/perl5/5.8.8 -Dman3dir=/usr/local/lib/perl5/5.8.8/perl/man/man3 -Dman1dir=/usr/local/man/man1 -Dsitearch=/usr/local/lib/perl5/site_perl/5.8.8/mach -Dsitelib=/usr/local/lib/perl5/site_perl/5.8.8 -Dscriptdir=/usr/local/bin -Dsiteman3dir=/usr/local/lib/perl5/5.8.8/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Ui_malloc -Ui_iconv -Uinstallusrbinperl -Dcc=cc -Duseshrplib -Dccflags=-DAPPLLIB_EXP="/usr/local/lib/perl5/5.8.8/BSDPAN" -Doptimize=-O2 -fno-strict-aliasing -pipe  -Ud_dosuid -Ui_gdbm -Dusethreads=n -Dusemymalloc=y -Duse64bitint'
          hint=recommended, useposix=true, d_sigaction=define
          usethreads=undef use5005threads=undef useithreads=undef usemultiplicity=undef
          useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
          use64bitint=define use64bitall=undef uselongdouble=undef
          usemymalloc=y, bincompat5005=undef
        Compiler:
          cc='cc', ccflags ='-DAPPLLIB_EXP="/usr/local/lib/perl5/5.8.8/BSDPAN" -DHAS_FPSETMASK -DHAS_FLOATINGPOINT_H -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include',
          optimize='-O2 -fno-strict-aliasing -pipe ',
          cppflags='-DAPPLLIB_EXP="/usr/local/lib/perl5/5.8.8/BSDPAN" -DHAS_FPSETMASK -DHAS_FLOATINGPOINT_H -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include'
          ccversion='', gccversion='3.4.4 [FreeBSD] 20050518', gccosandvers=''
          intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=12345678
          d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
          ivtype='long long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
          alignbytes=4, prototype=define
        Linker and Libraries:
          ld='cc', ldflags =' -Wl,-E -L/usr/local/lib'
          libpth=/usr/lib /usr/local/lib
          libs=-lm -lcrypt -lutil
          perllibs=-lm -lcrypt -lutil
          libc=, so=so, useshrplib=true, libperl=libperl.so
          gnulibc_version=''
        Dynamic Linking:
          dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='  -Wl,-R/usr/local/lib/perl5/5.8.8/mach/CORE'
          cccdlflags='-DPIC -fPIC', lddlflags='-shared  -L/usr/local/lib'

      Characteristics of this binary (from libperl):
        Compile-time options: MYMALLOC PERL_MALLOC_WRAP USE_64_BIT_INT
                              USE_LARGE_FILES USE_PERLIO
        Locally applied patches:
              defined-or
        Built under freebsd
        Compiled at Mar 15 2006 08:54:13
        @INC:
          /usr/local/lib/perl5/5.8.8/BSDPAN
          /usr/local/lib/perl5/site_perl/5.8.8/mach
          /usr/local/lib/perl5/site_perl/5.8.8
          /usr/local/lib/perl5/site_perl
          /usr/local/lib/perl5/5.8.8/mach
          /usr/local/lib/perl5/5.8.8
          .

      gruss

      --
      Swiss Army Chainsaw
      Terrorific!
      VI VI VI - the editor of the beast!
      1. Hell-O!

        open (OUTPUT ">", $output_file);
        Nur zur Info an Eternius: Das ist die Syntax von Perl 5.8, niedrigere Versionen unterstützen diese Schreibweise m.E. noch nicht.
          danke, aber bei aller liebe gibt das bei meiner version nen syntax fehler :( (hättest du vielleicht einen link parat?)

        Ja, klar: http://perldoc.perl.org/functions/open.html (Perl 5.8.8). Allerdings sehe ich gerade, dass hinter den Filehandle noch ein Komma gehört:

        open OUTPUT, ">", $output_file;

        Das müsste es eigentlich tun.

        Siechfred

        --
        Hier könnte Ihre Werbung stehen.
        Viel Lärm um nichts || Die neue 1%-Regelung
        1. Hallo,

          Ja, klar: http://perldoc.perl.org/functions/open.html (Perl 5.8.8). Allerdings sehe ich gerade, dass hinter den Filehandle noch ein Komma gehört:

          |

          ähem, den link hätt ich eigentlich selber kennen sollen :D

          danke && gruss

          --
          Swiss Army Chainsaw
          Terrorific!
          VI VI VI - the editor of the beast!