Unterprogrammtechnik
Kurti
- perl
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
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
Danke für die umfangreiche Auskunft!
Kurti