Kurti: Unterprogrammtechnik

Hi,
ich bin noch Anfänger in Perl und möchte möglichst wenige Anfängerfehler machen.
Ich habe einiges über lokale/globale/u.a. Variablen gelesen. So ganz schlau bin ich nicht geworden. Man kann damit ja so vieles falsch machen.
Daher die konkrete Frage:

Ich rufe in einem Programm eine externe Routine 'konvert' auf.

  
.....  
use myperllib qw(.....  konvert   ....);  
.....  
my $parm1 = 'xxxx';  
my $parm2 = 'yyyy';  
.....  
konvert ($parm1, $parm2);  
.....  

Die Routine 'konvert' liegt in der Datei myperllib.pm:

  
.....  
@EXPORT_OK = qw(.....  konvert   ....);  
.....  
sub konvert {  
    my ($p1, $p2) = @_;  
    my ($er1, $er2, $erg3, $erg4);  
        .....  
return ????;  
}  

Diese Unterroutine soll die vier Werte $erg1 - 4 zurückliefern.
Wie liefere ich diese zurück und wie definiere ich sie im rufenden Programm?
Danke für Eure Hilfe
Kurti

  1. Die Routine 'konvert' liegt in der Datei myperllib.pm:

    .....
    @EXPORT_OK = qw(.....  konvert   ....);
    .....
    sub konvert {
        my ($p1, $p2) = @_;
        my ($er1, $er2, $erg3, $erg4);

    Achte auf deine Typos hier.
    Ich hätte in dem Fall schlicht
        my @results;
    geschrieben

    return ????;

    if( 'some_error_occured' ){ return; }

    return @results;

    }

      
    ~~~perl
    package main;  
      
    my @results = konvert( @somepars );  
      
    if( @results ){ ... }  
    else{ die "ein Fehler trat auf $!" }
    

    Wenn deine Funktion mehr als drei parameter aufnimmt, solltes du dir die Übergabe eines hashes überlegen

    # als Hashreferenz  
    my @results = some_op(  
        {  
          prop1  => $val1,  
          prop2  => $val2,  
        }  
      );  
      
    # als Liste (=> ist gleichbedeutend mit , )  
    my @results = some_op(  
        prop1  => $val1,  
        prop2  => $val2,  
      );  
      
    
    
    package myperllib;  
      
    some_method{  
       # teste ob eine Referenz oder ein Array übergeben wurde  
       my %pars = ( ref $_[0] eq 'HASH' ? %{$_[0]} : @_ );  
       # go on...  
    }
    

    Deine API bleibt so unberührt von späteren Änderungen.

    Willst du dir nicht den ganzen Namespace mit importierten Funktionen versauen, wäre ein Objektorientierter Ansatz sinnvoll.

    my $ob = new myperllib;  
    my @results = $ob->method( x=>1, y=>2 );
    

    mit dem Konstruktor

    package myperllib;  
      
    new{  
      my $class=shift;  
      my $self = {};  
      bless $self, $class;  
      return $self;  
    }
    

    mfg Beat

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische
    1. Danke für die umfangreiche Auskunft!
      Kurti