Ho un subroutine con un prototipo del genere:SP con hash e facoltativo argomento scalare
sub printFoo(%) {
my (%hashFoo)[email protected]_;
# do stuff with the hash
}
Ma vorrei facoltativamente passare in un secondo argomento scalare in questo modo:
sub printFoo(%;$) {
my (%hashFoo,$optionalArg)[email protected]_;
# do stuff with the hash and the optional arg
}
I capisci che in modalità di avviso questo è un no-no, ma non sono sicuro del perché.
Suppongo che potrei usare un flag di variabile globale, ma qualche consiglio su come realizzare elegantemente questo tipo di firma di funzione?
È possibile passare un riferimento all'hash anziché all'hash stesso –
I prototipi non servono per la creazione di firme di funzioni, ma per il fatto che le funzioni si comportano come funzioni integrate. Il consiglio generale quando si tratta di prototipi, non è quello di usarli. La funzione recupera tutti i @_ in% hashFoo. Puoi controllare la lunghezza di @_ e inserire l'argomento facoltativo prima di decomprimerlo in% hashFoo. – xxfelixxx
La soluzione più pulita sarebbe quella di avere l'argomento opzionale solo da includere con il resto dei parametri (foo => bar, baz => 123, speciale => 3), e trattare il parametro speciale in modo speciale (con un valore predefinito se è non passato in) – xxfelixxx