4 Stimmen

Überprüfen von Perl-Argumenten für Unterprozesse

Also bin ich ein Anfänger-Perl-Programmierer. Ich benutze es seit etwa einem Monat, aber erst in der letzten Woche habe ich es für etwas anderes als sysadmin-Aufgaben verwendet. Dabei bin ich auf folgende Frage gestoßen,

Perl-Unterprozesse sind wirklich flexibel und sie legen nicht viele/keine Einschränkungen für die Argumente fest, die Sie übergeben. Wie ist es möglich, entweder die Anzahl der Argumente zu erzwingen und/oder zu überprüfen, ob es sich um Referenzen, Skalare usw. handelt?

Zur Klarstellung, hier ist was ich derzeit für Perl-Unterprozesse mache:

sub mySub{
    ($a, $b) = @_;
    weiter und verwende diese Methoden
 }

Aber das bietet keine Garantie dafür, was $a und $b enthalten. Gibt es eine Möglichkeit sicherzustellen, dass sie Werte enthalten, zum Beispiel eine Referenz für $a und einen Skalar für $b?

Vielen Dank im Voraus.

EDIT: Als ich Skalar für $b sagte, meinte ich, dass es eine Ganzzahl enthält und keine Referenz zu einer anderen Datenstruktur ist.

3voto

jpalecek Punkte 45829

Sie können das Params::Validate Modul verwenden, es bietet weitreichende Möglichkeiten zur Überprüfung der Argumentliste.

In Ihrem Fall wäre etwas wie

validate_pos(@_, { type => HASHREF | ARRAYREF }, { type => SCALAR })

würde es tun (beachten Sie, dass es kein einzelner Typ für "ref" ist). Es bricht ab, wenn die Parameter nicht übereinstimmen.

1voto

Barton Chittenden Punkte 4083

Sie sollten dies mit Hilfe von Unterprogramm-Prototypen spezifizieren können:

Siehe http://perldoc.perl.org/perlsub.html#Prototypes für eine ausführliche Erklärung.

Unterprogramm, das einen einzelnen Skalarwert entgegennimmt

sub foo($) {
    my $scalar = shift;
}

Unterprogramm, das zwei Skalarwerte entgegennimmt

sub bar($$) {
    my ($scalar1, $scalar2) = @_;
}

Unterprogramm, das ein Array entgegennimmt

sub baz (+*) {
    my $arrayref = shift;
}

Unterprogramm, das einen Hash entgegennimmt

sub quux (+%) {
    my $hashref = shift;
}

0voto

Soz Punkte 957

Um zu überprüfen, ob $a eine Referenz ist, können Sie verwenden

if (ref($a)) 

Um zu überprüfen, um welche Art von Referenz es sich handelt, können Sie verwenden

if (ref($a) eq "HASH") { #oder ARRAY

0voto

TLP Punkte 65295

Sie können Tests an den Argumenten durchführen, um herauszufinden, was sie enthalten. Es macht jedoch keinen Sinn zu überprüfen, ob ein Skalar ein Skalar ist.

sub mySub{
    my ($a, $b) = @_;
    if (ref $a eq 'ARRAY') { ... } # Prüfung auf Array-Referenz
    continue and use these methods
 }

Eine Variable wie $b ist bereits ein Skalar und kann nur Skalarwerte enthalten. Eine Referenz ist beispielsweise ein Skalarwert. Sie müssen also genauer angeben, was Sie möchten, dass die Variable enthält.

Das Zählen der Argumente ist so einfach wie das Zählen eines beliebigen Arrays:

sub foo {
    my $n_args = @_;  # Array im skalar-Kontext gibt seine Größe zurück
    if (@_ < 4) {     # dasselbe
    ...
}

Um zum Beispiel eine alphanumerische Zeichenfolge zu validieren, können Sie Folgendes tun

if ($arg =~ /^[\w\s]+$/) {  # enthält nur Leerzeichen und alphanumerische Zeichen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X