The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Quiq::Parameters - Verarbeitung von Programm- und Methodenparametern

BASE CLASS

Quiq::Object

METHODS

Universelle Methode

extract() - Extrahiere Optionen und Argumente

Synopsis

    # Options/Property-Werte an Variablen zuweisen
    $argA = $class->extract(1,$properties,$encoding,\@params,
        $maxArgs,@optRef);
    
    # Options/Property-Wertpaare per Optionsobjekt zurückgeben
    ($argA,$opt) = $class->extract(0,$properties,$encoding,\@params,
        $maxArgs,@optVal);

Arguments

$varMode (0 oder 1)

Der erste Parameter entscheidet, ob die Optionswerte an ein Optionsobjekt (0) oder an Variablen (1) zugewiesen werden.

$properties (0 oder 1)

Die Parameter sind Attribut/Wert-Paare, die in @optRef bzw. @optVal spezifiziert sind. Argumente gibt es nicht.

$encoding

Programm-Parameter müssen ggf. dekodiert werden. Dies geschieht, wenn mit diesem Parameter ein Encoding vereinbart wird. Sollen die Parameter nicht dekodiert werden, was bei der Verarbeitung von Methodenparametern typischerweise der Fall ist, wird undef angegeben.

@params

Parameterliste, z.B. @ARGV oder @_.

$maxArgs

Anzahl der maximal zu extrahierenden Argumente (Argument = Parameter, der nicht mit einem Bindestrich beginnt). Die Anzahl der tatsächlich extrahierten Argumente kann niedriger sein, wenn weniger Argumente vorhanden sind. Sind mehr Argumente in @params vorhanden, bleiben die überzähligen Argumente in @params stehen. undef bedeutet eine unbegrenzte Anzahl.

@optVal

Liste der Optionen (Option = Parameter, der mit einem Bindestrich beginnt) und ihrer Defaultwerte. Optionen und ihre Werte, die in der Liste nicht vorkommen, werden nicht extrahiert.

@optRef

Wie @optVal, nur dass anstelle des Defaultwerts eine Variablenreferenz angegeben ist. An diese Variable wird der Optionswert zugewiesen.

Returns

$argA

Array-Objekt mit den (maximal $maxArgs) Argumenten aus @params.

$opt

Hash-Objekt mit den Optionen aus @params gemäß @optVal.

Description

Extrahiere Argumente und Optionen aus der Parameterliste @params. Enthält die Parameterliste mehr Argumente oder Optionen als vorgegeben sind, bleiben diese in @params stehen. Dies eröffnet die Möglichkeit, Argumente und Optionen über mehrere Aufrufebenen sukzessive zu verarbeiten.

Fehlerbehandlung

Die Methode kennt keine Fehler. Überzählige Argumente oder Optionen, die nicht in der Optionsliste @optVal (bzw. @optRef) vorkommen, bleiben in @params, werden also nicht extrahiert. Die Anzahl der Argumente $maxArgs ist eine maximale Anzahl, die unterschritten werden kann.

Es obliegt dem Aufrufer, durch Tests auf @params und @$argA zu prüfen, ob beim Aufruf des Programms oder der Methode zu viele Parameter (= @params wurde nicht komplett geleert) oder zu wenige Parameter (= @$argA enthält nicht genügend Elemente) übergeben wurden.

Eine mögliche Wrapper-Methode für eine finale Parameterverarbeitung, die bei zu wenig/zu vielen Argumenten oder nicht vereinbarten Optionen eine Exception wirft:

    sub parameters {
        my ($self,$varMode,$properties,$encoding,$paramA,$minArgs,
            $maxArgs) = splice @_,0,6;
    
        my ($argA,$opt) = Quiq::Parameters->extract($varMode,$properties,
            $encoding,$paramA,$maxArgs,@_);
        if (@$paramA) {
            die "ERROR: Unexpected parameter(s): @$paramA\n";
        }
        elsif (@$argA < $minArgs) {
            die "ERROR: Too few arguments\n";
        }
    
        if ($varMode) {
            return wantarray? @$argA: $argA;
        }
    
        return ($argA,$opt);
    }

Spezialisierte Methoden

Die nachfolgenden Methoden sind auf Basis der Methode extract() implementiert. Sie realsieren Vereinfachungen für bestimmte Anwendungsfälle.

extractPropertiesToVariables() - Extrahiere Properties und weise sie an Variablen zu

Synopsis

    $class->extractPropertiesToVariables(\@params,@optRef);

Arguments

@params

Parameterliste, z.B. @_.

@optRef

Liste der Properties (und Optionen) und ihrer Variablenreferenzen.

Returns

Nichts.

Description

Extrahiere Properties (und Optionen) aus der Parameterliste @params. Enthält die Parameterliste unbekannte Properties (oder Optionen), wird eine Exception geworfen. Die Methode wird typischerweise zur Verarbeitung von Methodenparametern genutzt.

Example

Methode, die eine WikiMedia-Tabelle generiert. Die Tabelleneigenschaften werden als Property/Wert-Paare übergeben:

    sub table {
        my $self = shift;
        # @_: @keyVal
    
        my $alignA = [];
        my $bodyBackground = '#ffffff';
        my $caption = undef;
        my $rowA = [];
        my $titleBackground = '#e8e8e8';
        my $titleA = [];
        my $valueCb = undef;
    
        Quiq::Parameters->extractPropertiesToVariables(\@_,
            alignments => \$alignA,
            bodyBackground => \$bodyBackground,
            caption => \$caption,
            rows => \$rowA,
            titleBackground => \$titleBackground,
            titles => \$titleA,
            valueCallback => \$valueCb,
        );
        ...
    }

extractToVariables() - Extrahiere Parameter und weise Optionen Variablen zu

Synopsis

    @args | $argA = $class->extractToVariables(\@params,$minArgs,$maxArgs,@optRef);

Arguments

@params

Parameterliste, z.B. @_.

$minArgs

Mindestanzahl an Argumenten.

$ maxArgs Maximale Anzahl an Argumenten, undef bedeutet beliebig viele.

@optRef

Liste der Optionen und ihrer Variablenreferenzen.

Returns

$argA

Referenz auf die Liste der extrahierten Argumente.

Description

Extrahiere Argumente und Optionen aus der Parameterliste @params. Enthält die Parameterliste unbekannte Optionen oder zu wenige oder zu viele Argumente, wird eine Exception geworfen.

Example

Konstruktor mit einer variablen Anzahl an Argumenten und zwei Optionen:

    sub new {
        my $class = shift;
        # @_: $url,@opt -or- $url,$user,$passw,@opt
    
    
        my $color = 1;
        my $debug = 0;
    
        my $argA = Quiq::Parameters->extractToVariables(\@_,1,3,
            -color => \$color,
            -debug => \$debug,
        );
        my ($url,$user,$password) = @$argA;
        ...
    }

VERSION

1.130

AUTHOR

Frank Seitz, http://fseitz.de/

COPYRIGHT

Copyright (C) 2019 Frank Seitz

LICENSE

This code is free software; you can redistribute it and/or modify it under the same terms as Perl itself.