Perl n'a pas de signatures de type ou de paramètres formels, contrairement à d'autres langages comme C:
// C code
int add(int, int);
int sum = add(1, 2);
int add(int x, int y) {
return x + y;
}
Au lieu de cela, les arguments sont tout simplement passé en liste plate. Toute validation de type se produit à l'intérieur votre code; vous devrez l'écrire manuellement. Vous devez décompresser l'arglist en variables nommées vous-même.Et vous ne prédéclarer généralement pas vos sous-routines:
my $sum = add(1, 2);
sub add {
my ($x, $y) = @_; # unpack arguments
return $x + $y;
}
Si vous prédéclarer vos sous-marins, vous obtenez les éléments suivants:
- Vous pouvez appeler les sous-marins sans parens
- Vous pouvez modifier les arguments de façon sont analysés avec des « prototypes »
Un prototype peut dire
- évaluer cet argument dans un contexte scalaire:
sub foo($)
, ou
- cet argument doit être une variable de hachage, s'il vous plaît le transmettre comme référence:
sub foo(\%)
ou
- ce sous prend aucun argument:
sub foo()
, etc.
Ne les utilisez pas pour valider le nombre d'arguments. En fait, ne les utilisez pas du tout; ils provoquent une action à distance. Ils ne sont pas utiles pour la validation de type non plus.
Votre erreur provient du fait que vous avez déclaré votre sous-élément comme étant nul, cela a causé une erreur d'analyse . Si vous souhaitez pouvoir déclarer vos sous-programmes avec des paramètres nommés, vous pouvez utiliser un module qui les implémente. Il y a quelques mises en garde:
- Ces modules ne sont pas très répandus, ne les utilisez donc que pour des projets internes où la portabilité n'est pas un problème.
- Ils ne fonctionnent que sur les nouveaux Perls
- Ils souvent gâcher vos numéros de ligne :(
Une bonne mise en œuvre est Method::Signatures
qui permet également le type de validation (et la valeur):
use Method::Signatures;
my $sum = add(1, 2);
func add(Int $x, Int $y) {
return $x + $y;
}
Cependant , ces "signatures" ont rien à faire avec les prototypes de sous-marins.
Donc, pour traduire ce que vous avez J'ai dit, je devrais enlever la ligne un et je devrais aller bien, non? : D – Lucian
@ user2493988 - exactement. – DVK
et supprimer le prototype sur la déclaration de la deuxième fonction afin qu'il devienne 'sub remCH {' ... – plusplus