Mam podprogram z prototypem takich jak to:Subroutine z hash i opcjonalnym skalarnego argumentu
sub printFoo(%) {
my (%hashFoo)[email protected]_;
# do stuff with the hash
}
Ale chciałbym ewentualnie podanie w drugim skalarnego argumentu takiego:
sub printFoo(%;$) {
my (%hashFoo,$optionalArg)[email protected]_;
# do stuff with the hash and the optional arg
}
I Rozumiem, że w trybie ostrzegawczym jest to nie-nie, ale nie jestem pewien dlaczego.
Przypuszczam, że mogę użyć flagi zmiennej globalnej, ale jakiejkolwiek porady, jak elegancko wykonać tego typu podpis funkcji?
Można przekazać odwołanie do skrótu zamiast samego skrótu. –
Prototypy nie służą do tworzenia sygnatur funkcji, ale mają funkcje zachowujące się jak wbudowane funkcje. Generalnie radzimy, gdy chodzi o prototypy, nie należy ich używać. Funkcja zgarnie wszystkie @_ do% hashFoo. Możesz sprawdzić długość @_ i wyrzucić opcjonalny argument przed rozpakowaniem go na% hashFoo. – xxfelixxx
Najczystszym rozwiązaniem byłoby dodanie opcjonalnego argumentu do reszty parametrów (foo => bar, baz => 123, specjalne => 3) i potraktowanie specjalnego parametru specjalnie (z wartością domyślną, jeśli jest to parametr nie przeszedł) – xxfelixxx