Bonjour à tous,

j'ai une petite question sur les prototypes de fonctions, plus particulièrement quand on passe un bloc de code avec l'éperluette (&). Voici un exemple de code qui ne retourne pas le bon résultat:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
sub my_map(&@) {
  my $block = shift;
  my @new;
 
  foreach my $e (@_) {
    push @new, $block->($e);
  }
  return @new;
}
 
 
my @a = my_map { $_ + 3 } (1, 2, 3, 4);
print "@a\n";
Au lieu d'écrire 4 5 6 7 comme on s'y attendrait, on obtient le résultat 3 3 3 3. Afin d'obtenir la bonne réponse, on doit éliminer la variable $e du code et utiliser $_ à la place, comme suit:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
sub my_map(&@) {
  my $block = shift;
  my @new;
 
  foreach (@_) {
    push @new, $block->($_);
  }
  return @new;
}
 
 
my @a = my_map { $_ + 3 } (1, 2, 3, 4);
print "@a\n";
Quelqu'un peut-il m'expliquer pourquoi?