2013-02-08 3 views
2

Обнаружено это внутри цикла. Я прочитал о сращивании, но это просто смутило меня больше. Я не знаком с Perl, но пытаюсь перевести алгоритм на другой язык.Что делает этот кусок кода Perl в условиях laymans?

my $sill = splice(@list,int(rand(@list)),1); 
     last unless ($sill); 

Конкретно: что будет внутри порога $, если он не выходит из цикла из последнего?

Спасибо за помощь!

ответ

4

Это случайное удаление одного элемента из массива @list. Это значение присваивается $sill. Если это ложное значение, из него выходит замкнутый цикл (не показан).

splice принимает массив, смещение и длину, а также список заметок. Если замена не указана, элементы будут удалены.

Длина постоянна (1 элемент), но смещение рассчитывается как случайное целое число, меньшее от 0 до длины @list.

+0

так что $ sill имеет значение удаленного элемента? Как будто работает стек, но он появляется случайно? – user2054454

+0

@ пользователь2054454 да, точно. (Фактически, структура данных работает как «(дважды) связанный список») – amon

+0

ладно, спасибо за быструю помощь. – user2054454

2

Это означает, что:

  • удалить случайный элемент из массива list (0 -> номера элемента списка) и
  • присвоить переменную sill с удаленным элементом (pop() подобное) и
  • выхода из цикла, если sill переменная ложна

См http://perldoc.perl.org/functions/splice.html

+0

Незначительная коррекция в вашей последней точке: она выходит из цикла, если '$ sill' является ложным, а не если он недействителен. Помимо 'undef' (void), число 0, строка '0' и пустая строка также являются ложными и вызовут цикл для выхода. Чтобы выйти, только когда '$ sill' является void /' undef', вы должны использовать 'last, если не задано $ sill'. –

+1

POST отредактирован соответствующим образом –

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