Ich habe ein Unterprogramm mit einem Prototyp wie folgt aus:Unterprogramm mit Hash und optional skalaren Argument
sub printFoo(%) {
my (%hashFoo)[email protected]_;
# do stuff with the hash
}
Aber ich möchte Pass in einer zweiten skalaren Argument wie dies optional:
sub printFoo(%;$) {
my (%hashFoo,$optionalArg)[email protected]_;
# do stuff with the hash and the optional arg
}
I Verstehen Sie, dass dies im Warnmodus ein Nein ist, aber ich bin mir nicht sicher warum.
Ich nehme an, ich könnte ein globales Variablenflag verwenden, aber irgendeinen Ratschlag, wie man diese Art von Funktionssignatur elegant erreicht?
Sie könnten anstelle des Hashs selbst einen Verweis auf den Hash übergeben. –
Prototypen dienen nicht zum Erstellen von Funktionssignaturen, aber Funktionen verhalten sich wie integrierte Funktionen. Der allgemeine Ratschlag, wenn es um Prototypen geht, besteht darin, sie nicht zu verwenden. Die Funktion wird alle @_ in% HashFoo aufheben. Sie können die Länge von @_ überprüfen und das optionale Argument abbrechen, bevor Sie es in% hashFoo entpacken. – xxfelixxx
Die sauberste Lösung wäre, das optionale Argument einfach in den Rest der Parameter (foo => bar, baz => 123, special => 3) aufzunehmen und den speziellen Parameter speziell zu behandeln (mit einem Standard, wenn es das ist) nicht weitergegeben) – xxfelixxx