L'autre jour, nécessaire pour itérer sur un sous-ensemble d'un tableau à la fois. Au départ, je l'ai fait avec épissure - déchirer le tableau n'a pas posé de problème dans ce cas. Il renverrait N éléments à la fois, ou ce qui restait à la fin de la liste. Tout allait bien.Pourquoi grep sur ma tranche de tableau provoque un débordement de pile en Perl?
Puis il s'est avéré que j'avais besoin du tableau plus tard. Au lieu de splice, je suis passé à des tranches de tableau. BOOM! Le programme a explosé, envoyant un débordement de pile partout. Quelle? Pourquoi? Comment? J'ai joué avec et j'ai trouvé quelques variantes qui fonctionneraient. Voici le script de test pour démontrer ce problème:
use strict;
use warnings;
my @array = qw(a b c d e f g h i j k l m n o p q r s t u v z x c v b a s d f g a s d f a se g);
my $numPerTest = 5;
my $index = 0;
print "Separating out the subset before grepping it, good.\n";
while ($index < @array)
{
print "Iteration $index\n";
my @subset = @array[$index..($index+$numPerTest)];
@subset = grep { defined $_ } @subset;
$index += $numPerTest;
}
$index = 0;
print "Making a copy of the array before grepping works.\n";
while ($index < @array)
{
print "Iteration $index\n";
my @subset = grep { defined $_ } @{[ @array[$index..($index+$numPerTest)] ]};
$index += $numPerTest;
}
$index = 0;
print "Grepping the array slice directly, explodey!\n";
while ($index < @array)
{
print "Iteration $index\n";
my @subset = grep { defined $_ } @array[$index..($index+$numPerTest)];
$index += $numPerTest;
}
(En fait, je viens de comprendre celui-ci, mais je me suis dit que je pourrais aussi bien l'afficher quand même voir si quelqu'un d'autre le voit :)..)
(De plus, si vous ne le voyez pas, this a une autre façon d'expliquer pourquoi cela se produit.)
Ne nous tenez pas en haleine. Je ne le vois pas. –
Est-ce parce que vous allez au-delà des limites du tableau lorsque $ index + $ numPerTest est> @array? –
Cela aiderait si vous aviez bouclé $ index <@array - $ numPerTest. En outre, ce que vous voulez faire est de prendre une tranche de $ index. ($ Index + $ numPerTest -1). En ce moment, vous prenez un élément de plus que $ numPerTest –