Ваша ошибка: вы используете foreach
(извлечение элементов списка) и модифицируете (pop
) тот же массив !Процитируем perlsyn :
Если какая-либо часть LIST является массивом, foreach
очень запутается, если вы добавите или удалите элементы в теле цикла, например, с помощью splice
. Так что не делайте этого.
Ниже показано, что происходит в вашем коде:
#!/usr/bin/perl
use warnings;
use strict;
print "ARGV BEFORE: ", scalar(@ARGV), "\n";
my $count = 0;
foreach my $loop (@ARGV) {
++$count;
print "ARGV beginning loop ${count} for ${loop}: ", scalar(@ARGV), "\n";
pop @ARGV;
print "ARGV end loop ${count} for ${loop}: ", scalar(@ARGV), "\n";
}
print "ARGV AFTER: ", scalar(@ARGV), "\n";
exit 0;
Тестовый прогон:
$ perl dummy.pl 1 2 3 4
ARGV BEFORE: 4
ARGV beginning loop 1 for 1: 4
ARGV end loop 1 for 1: 3
ARGV beginning loop 2 for 2: 3
ARGV end loop 2 for 2: 2
ARGV AFTER: 2
Сравните это с правильным подходом, который повторно проверяет список на каждой итерации:
while (@ARGV) {
++$count;
print "ARGV beginning loop ${count}: ", scalar(@ARGV), "\n";
pop @ARGV;
print "ARGV end loop ${count}: ", scalar(@ARGV), "\n";
}
$ perl dummy.pl 1 2 3 4
ARGV BEFORE: 4
ARGV beginning loop 1: 4
ARGV end loop 1: 3
ARGV beginning loop 2: 3
ARGV end loop 2: 2
ARGV beginning loop 3: 2
ARGV end loop 3: 1
ARGV beginning loop 4: 1
ARGV end loop 4: 0
ARGV AFTER: 0
При этом: ПОЖАЛУЙСТА сделайте себе одолжение ипродумайте свою архитектуру / дизайн SW.Неправильное использование переменных Perl с определенной семантикой для собственных целей - крайне плохая идея.