Как реализованы массивы в Perl?
Массив Perl - это абстрактный тип данных. Каков внутренний механизм для массива Perl? Это реализовано с динамическим массивом или связанным списком? Поскольку элементы массива имеют произвольный доступ, я бы предположил, что динамический массив указателей или ссылок на скаляры имеют смысл. Однако, с операциями shift и unshift во главе массива, массив должен был бы переместить все свои элементы с этими операциями? звучит неэффективно для меня. Есть мысли?
2 ответа
Посмотрите на это: http://www.perlmonks.org/?node_id=17890
(взято оттуда:)
Perl реализует списки с массивом и смещением первого / последнего элемента. Массив выделяется больше, чем необходимо, смещения, изначально указывающие на середину массива, так что есть место для роста в обоих направлениях (unshifts и push / вставки), прежде чем потребуется перераспределение базового массива. Следствием этой реализации является то, что все операторы примитивного списка perl (вставка, выборка, определение размера массива, push, pop, shift, unshift и т. Д.) Выполняются за O(1) времени.
Типы задокументированы в perlguts (см. Внутреннюю документацию Perl для соответствующей документации) - и AV для массивов и HV для хэшей.