Je vais copier la partie pertinente de ma réponse de the other question ici.
La deuxième considération souvent négligée est l'interface. Comment le tableau retourné va-t-il être utilisé? C'est important parce que le déréférencement de tableaux entiers est un peu terrible en Perl. Par exemple:
for my $info (@{ getInfo($some, $args) }) {
...
}
C'est moche. Ceci est vraiment mieux.
for my $info (getInfo($some, $args)) {
...
}
Il se prête également à la cartographie et au grepping.
my @info = grep { ... } getInfo($some, $args);
Mais le retour d'une référence à un tableau peut être pratique si vous allez choisir les éléments individuels:
my $address = getInfo($some, $args)->[2];
C'est plus simple que:
my $address = (getInfo($some, $args))[2];
Ou:
my @info = getInfo($some, $args);
my $address = $info[2];
Mais à ce stade, vous sho Uld question de savoir si @info est vraiment une liste ou un hachage. À la différence des tableaux et des références de tableaux, il y a peu de raison de choisir de renvoyer un hachage sur une référence de hachage. Les références de hachage permettent une main courte pratique, comme le code ci-dessus. Et inversement des tableaux vs refs, cela rend le cas de l'itérateur plus simple, ou évite au moins une variable d'intermédiaire.
for my $key (keys %{some_func_that_returns_a_hash_ref}) {
...
}
Ce que vous ne devriez pas faire est d'avoir un retour getInfo()
ref tableau dans un contexte scalaire et un tableau dans un contexte de liste. Cela embrouille l'utilisation traditionnelle du contexte scalaire en tant que longueur de tableau qui surprendra l'utilisateur.
Je voudrais ajouter que tout en faisant tout ce que X est une bonne règle, ce n'est pas d'une importance primordiale dans la conception d'une bonne interface. Aller un peu trop loin avec cela et vous pouvez facilement faire rouler d'autres préoccupations plus importantes.
Enfin, je vais brancher mon propre module, Method::Signatures, car il offre un compromis pour passer des références de tableau sans avoir à utiliser la syntaxe de tableau ref.
use Method::Signatures;
method foo(\@args) {
print "@args"; # @args is not a copy
push @args, 42; # this alters the caller array
}
my @nums = (1,2,3);
Class->foo(\@nums); # prints 1 2 3
print "@nums"; # prints 1 2 3 42
Cela se fait par la magie de Data::Alias.
Dans "my ($ result) = [];", pourquoi les parens? – ysth
Encore une fois, par souci de cohérence, je fais toujours my ($ foo); my ($ bar, $ baz); Je ne fais jamais 'my $ foo' parce que certains de mes "my's" sont dans un contexte scalaire et d'autres dans un contexte de liste. Par conséquent, je fais parfois mon ($ cnt) = scalaire (@array); qui, j'en suis sûr, conduirait certaines personnes à la folie .... –