2014-09-17 2 views
-1

В следующем Perl-коде массив @subset никогда не становится больше, чем 5 элементов, это похоже на то, что perl обрабатывает 400 как 4, т. Е. Четыре, а не четыреста, это похоже на то, что это игнорирование нулей после 4.Perl - сравнение чисел в цикле

Почему это происходит?
Как я могу распознать число в четыреста, чтобы оно продолжалось до тех пор, пока длина массива @subset не станет 400?

# A list of more than 1000 numbers separated by commas 
my $list = '1444,99,112,1233,174,224,443,672,32,9821,...'; 

my $i = 0; 
my @arr = split(',', $list); 

# Move through the @arr copying elements to a temporary @subset array 
# Do this in batches of 400 
while ($i le $#arr) { 
    my @subset; 
    my $s = 1.0 * scalar(@subset); 

    while ($s le 400){ 
     push (@subset, $arr[$i]); 
     $s = 1.0 * scalar(@subset); 
     $i++; 
    } 

    # Do something with the @subset array here 
} 
+6

'ле' является для строк, использование '<=' для чисел. – asjo

ответ

3

Использование splice

while (my @subset = splice @arr, 0, 400) { 

Или, если вы не хотите быть разрушительным для вашего исходного массива, используйте цикл:

for (my $i = 0; $i < @arr; $i += 400) { 
    my @subset = @arr[ $i .. $i + 399 ]; 
+1

Другим неразрушающим подходом было бы использовать List :: MoreUtils natatime. Хотя технически это то же самое, что и ваш подход к сращиванию, но использует копию массива, – Chris

+3

Помимо правильного ответа, кто-то должен указать все различные ошибки op: '1.0 * scalar (@subset)' => 'scalar (@subset)' _IV not NV_ '$ s le 400' =>' $ s <400' _number not string_ '$ i le $ # arr' =>' $ i <@ arr' _and a типичная ошибка «один за другим» – rurban

Смежные вопросы