удалить из него лишние пары, у которых значения повторяются (т.е. только 1 такую пару оставить) наиболее эффективным методом. В хеше может быть миллион пар, так что приоритет – процессорное время.
Тест 2. Аксессоры
Уровень: middle
Напишите на Perl примитивный базовый класс MyApp::Accessor для использования в качестве базового класса для генерации аксессоров (методов которые сохраняют и отдают свойство объекта). Аксессоры должны работать настолько быстро, насколько это возможно в принципе. Какими технологиями/модулями, по вашему, лучше всего пользоваться в реальной разработке для создания аксессоров?
P.S. Accessor – это примитивная функция, которая служит для доступа к свойству объекта извне. Т.е. $obj->property – возвращает значение, а $obj->property($value) – устанавливает.
Тест 3. Обработка данных из БД
Уровень: middle
В базе данных есть большая таблица из 2х полей (id bigint primary key, data test), на порядки превышающая объем оперативной памяти. Нам требуется обработать её (т.е. прочитать все значения data). Как бы вы это организовали? Какие проблемы могут возникнуть при такой обработке?
PS: курсоры данная база не поддерживает.
Тест 4. Поправить утечку памяти
Уровень: middle
В данном примере память, естественно, утекает из-за перекрёстных ссылок.
while (1) {
my $a = {b => {}};
$a->{b}{a} = $a;
}
Как правильно инициализировать перекрестные ссылки, чтобы память из-за них не утекала?
Тест 5. Работа с памятью
Уровень: senior
while (1) {
my $a = {};
$a->{func} = sub {
$a->{cnt}++;
};
}
Что произойдет с памятью в этом примере и почему? Как исправить положение? Учтите, что это только искусственный пример - на практике $a чаще всего является долгоживущим объектом, который где-то хранится, и мы хотим иметь возможность звать на нём $a->{func}->() в других точках кода. Представьте, что вам надо дописать некий код в теле цикла так, чтобы можно было добавить $a->{func}->() в конце, и функция бы корректно вызвалась.
HTTP запрос
Пожалуйста, при выполнении этого задания не пользуйтесь LWP::* или AnyEvent, они не помогут во втором пункте задания, да и задание это нужно, чтобы посмотреть как вы умеете работать с сокетами, а не как это умеют работать модули.
Тест 6.1. Синхронный
Уровень: middle
Написать функцию http_get($host, $path, $query, $timeout), которая делает http запрос на адрес http://$host/$path?$query с таймаутом $timeout. Реализация http должна быть примитивной, то есть мы рассчитываем на ответ HTTP 200 OK с content-length, но при этом ответ надо вычитать до конца. $query передают в функцию хешом.
Тест 6.2. Асинхронный
Уровень: senior
А также написать асинхронную версию этой функции, которая (для простоты задания) отличается тем, что пока ждет ответа занимается заполнением какого-нить массива числами и выводит на экран сколько элементов успела добавить пока ждала ответа удаленного сервера. Программа должна оставаться в рамках 1 процесса и 1 потока (т.е. без fork и без threads).
Тест 7. Наследование
Уровень: middle
Есть следующие классы:
package AA;
sub func { print "AA\n" }
package BB;
use parent 'AA';
sub func { print "BB\n"; shift->SUPER::func(@_); }
package CC;
use parent 'AA';
sub func { print "CC\n"; shift->SUPER::func(@_); }
package DD;
use parent qw/BB CC/;
sub func { print "DD\n"; shift->SUPER::func(@_); }
В каких классах и в каком порядке будут вызваны функции func, если вызвать DD->func? По какому принципу мы должны построить наследование, если нам необходимо, чтобы при вызове DD->func, были вызваны функции во всех этих классах, и не меняя иерархию наследования?
Тест 8. Поиск в массиве
Уровень: middle
Дан массив из большого числа элементов (числа), отсортированный по возрастанию. Необходимо написать функцию, которая быстро найдет индекс элемента массива, значение по которому наиболее близко к переданному в аргументах функции числу. Используйте модуль Benchmark, чтобы оценить скорость написанного решения и оптимизировать его.
Это не то которое в вакансии, если что
Задание такое себе: переизобретение event loop'а, MRO. Надеюсь, с ним массово справляется хотя бы 1 человек в месяц.
Вы DBIx::Class пользуете?..
Мы где-то пользуем, где-то нет. Я бы не стал :)
Поздравляю. Вы пользуетесь MRO 'C3'
Умение в C3 должно воспитываться с младенчества, это понятно, но на удивление пользовался DBIx::Class и без этого понимания. Но в целом очевидно, что все, которые не в курсе, уже неисправимы
Я не понимаю - к чему вы ведете... Если вы пользуете Перл для веба и у вас Каталист или Моджо с эвент лупом внутри, то позвравляю - вам желательно знать как работает эвент луп. Чтобы у вас код не утекал. Если он у вас утекает, то ваш код не эффективен с точки зрения ресурсов. Каталист, да и Моджо вроде, зная что их будут использовать невежественные люди имеют режим принудительной перезагрузки после Х запросов. Это тормозит работу сервера, но позволяет не думать. Если вы используете наследование, то вам надо знать как работает множественное наследование в Перле. А MRO - это просто настройка этого наследования. И добровольный отказ от знания... Ну это как приехать в Диснейленд и весь день у входа на качельках просидеть. Можно? Можно.
У каталиста нет своего сервера для прода. Мы используем апач, которы киляет чилдов при достижении лимита и создаёт новых.
Внезапно... На чем мы-же лет 15 работаем...
path-through
Не слышал такого. Мы пробовали стармана, не зашло. Я пытался подружить каталист с nginx unit, но тогда они не дружили.
У нас раньше старман был... Сейчас движок от нашего UE пользуем.
Я веду к тому, что задание неадекватно: большинство перловиков не используют MRO и не пишут event loop'ы. И это не значит , что "не понимают, как event loop работает". Это какая-то уловка нехорошая: "если ты не написал свой event loop, то ты не понимаешь..." А с почему ли? Логика вышла из чата? А "изучить" MRO можно, просто прочитав, что это такое. Тем не менее, это не значит, что люди, которые знают, что такое MRO - особенные и как-то особенно подходят. Всё зависит от конкретных условий: если знания применяются, то они - инструмент, если нет - это в лучшем случае отличный повод попонтоваться. Я тогда пишу на ассемблере прям в машинных кодах местами, самостоятельно настраивая при этом переходя в защищённый решим и настраивая GDT, LDT и IDT.. А что, писал же 22 года назад - значит, могу. Мои понты жирнее Ваших, сэр!
Стикер
А если CC и BB местами внутри qw поменять -- иерархия наследования изменится?
удивительно, но да
Иерархия ж вроде такая же остаётся? Или я в глаза долблюсь
по дефолту методы в перле ищутся вглубь, а при множественном наследовании люди думаю что на каждом уровне горизонтально
Ну очевидно в ответ они что-то про с3 хотят увидеть
Каждое задание в нашем тестовом - это то с чем придется столкнуться работая у нас. Оно не просто так такое.
Обсуждают сегодня