[ Content | View menu ]

Линус Торвальдс о Eee PC

29.01.2010

В предыдущем посте — небольшая история о том, как в Linux была улучшена поддержка устройств экстра-маленького размера благодаря покупки Линусом Торвальдсом вышивальной машинки :) В письме Линуса в рассылку util-linux-ng@kernel.org было упомянуто, что для управления этой машинкой он использует Eee PC с Fedora 12 на борту. Как пользователь Eee PC 701g с почти двухлетним стажем, я заинтересовался и написал Линусу письмо с несколькими вопросами о его опыте использования этих компьютеров. Получилось мини-интервью, которое и предлагается вашему вниманию.

Q: Какие модели Eee PC Вы используете?
A: У меня их две штуки: 701 и 901.

Q: Это основной компьютер или один из дополнительных?
A: Нет, конечно же, это не основной компьютер. Atom тормозной как грех. Я считаю, что процессоры с прямым выполнением команд (in-order execution) — преступление против человечности, и я уверен в том, что если Intel не предпримет значительных шагов (т.е. сделает Atom out-of-order), ARM Cortex A9 захватит рынок low-end машин.

У меня есть пара нетбуков, потому что я люблю маленькие компьютеры и использую их в поездках. Но они никогда не могли бы служить основными машинами для разработки или чем-то вроде этого.

701 слишком мелкий для того, чтобы быть полезным. Экран крошечный и у него непозволительно маленькое разрешение. Клавиатуру едва можно использовать. 901 намного лучше и мог бы быть неплохим помощником в поездках, но разрешение тоже слишком маленькое (9 дюймов нормально, но 1024×600 юзабельно только для смартфонов, а для лэптопов подошло бы как минимум 1366×768, как мне кажется)

Поэтому я не использую ни один из них ни для чего, кроме тестирования. 901 используется моей женой для её вышивальной машинки, и для такого, обычного использования он подходит очень хорошо.

ВНИМАНИЕ! Наверно, следует заметить, что мои требования могут быть завышенными по сравнению с требованиями многих других людей. Моя основная машина — Nehalem 3.2 GHz c 6 GB RAM и двумя быстрыми SSD-дисками от Intel. Поэтому мои представления о том, какая производительность может считаться «приемлемой», могут не совпадать с представлениями других.

Q: какие задачи Eee PC помогает Вам выполнять?
A: Сейчас 701 работает тестовым стендом для совершенно различных вещей — я держу его поблизости в основном как 32-битный x86-стенд (все мои основные машины — x86-64, поэтому, если мне нужно проверить, что 32 бита еще работают, я использую 701).

901 я иногда использовал в поездках как лэптоп, и в основном он меня удовлетворял, но, откровенно говоря, существуют нормальные ноутбуки, которые намного-намного-намного лучше.

Например, я немного поигрался с машинами, основанными на CULV Core 2 Duo (вместо Atom) с экраном 1366×768 и внезапно обнаружил, что может быть намного более мощная (чем eeepc — прим.пер.) сборка. Она больше по размерам (10 дюймов), потребляет больше энергии, но оно того стоит.

Q: приобрели ли Вы эти нетбуки самостоятельно или они были подарены?
A: Оба Eee PC были подарены. 10″ CULV Core2 было самым достойным приобретением, на которое я потратил свои деньги.

Q: сколько времени Вы проводите перед этим нетбуком? Достаточен ли его размер для Вас?
A: См. выше. 701 и близко не стоял. 901 вполне пригоден к использованию, и если бы у него не было такое маленькое разрешение, он мог бы быть неплохим помощником в путешествиях.

Q: производились ли какие-нибудь аппаратные модификации?
A: в оба добавил памяти, вроде сейчас в обоих по 2 Гб (возможно, 701 был с 512 мегабайтами, и я проапгрейдил до гигабайта, слишком лениво проверять). И еще в оба добавил ПЗУ: в 701 — быструю SD-карточку (понятие «быстрая» тут весьма относительно, но для SD-карточки неплохой результат), в 901 — Mini-PCI SSD.

Мне нравятся high-end SSD (например, интеловские замены жестким дискам), но те, что используются в low-end нетбуках, страдают от ужасающе отвратительной скорости записи. Поэтому SSD в этих нетбуках, как правило, медленнее, чем реальные диски.

Q: и еще один, более общий вопрос. Как Ваше рабочее время распределено между кодированием и административной/политической/социальной деятельностью?
A: Сейчас кодирую очень мало. Практически всё время занято обсуждениями с другими разработчиками и внесением их изменений в ядро.

linux - 19 комментариев

Линус Торвальдс о машинках для вышивания

Часть первая.
На Рождество Санта Клаус подарил Туве Торвальдс машинку для вышивания. Среди прочих достоинств эта машинка имеет USB-интерфейс, по которому можно закачивать заранее приобретённые шаблоны вышивки в специальном закрытом формате. При подключении к компьютеру это чудо техники через минуту определяется как USB mass storage с файловой системой FAT12, при этом закачивание небольших файлов происходит очень долго и зачастую не приводит ни к каким результатам: о возникающих ошибках пользователю ничего не сообщается. Таково всё проприетарное ПО, — сетует Линус, — закрытые форматы, кривые прошивки, невнятные ошибки… Проблема предпросмотра шаблонов вышивок в формате PES на компьютере оказалась самой простой и теперь на git.kernel.org имеется специальная программа pesconvert для обслуживания вышивальных машинок.

Часть вторая.
Линус пишет письмо в рассылку util-linux-ng@vger.kernel.org с детальным описанием длительного процесса определения типов разделов и ФС на маленьком, медленном и подглючивающем блочном устройстве. После активного обсуждения (которое, несмотря на явную гиковость, можно читать как захватывающий детектив) было найдено несколько узких мест в утилите blkid, пытающейся определить более чем 50 типов файловых систем по их сигнатурам, что приводит к неоднократному чтению 69 килобайт с устройства, и в сумме объём прочитанных данных, с учётом упреждающего чтения, составляет около половины объёма всего устройства. Учитывая тот факт, что скорость обмена данными у этой штуки составляет 16 килобайт в секунду, простое определение единственного fat-раздела занимает около 30 секунд (всё это нужно для того, чтобы udev смог корректно примонтировать это устройство).

Совместными усилиями задержка была сведена к рекордному минимуму в полсекунды. Для этого Karel Zak (главный мейнтейнер util-linux-ng) добавил в blkid несколько опций, ограничивающих количество возможных ФС и объём читаемых данных для очень маленьких устройств (зачем пытаться определить raid на диске размером с полдискеты?), Линус немного оптимизировал кое-какие системные вызовы и теперь в ближайшем выпуске util-linux-ng будет заявлена поддержка очень маленьких дисков, а в ядре Linux, чем черт не шутит — частичная поддержка неких вышивальных машинок.

Часть третья последует, не пропустите.

linux - 11 комментариев

Несколько ссылок по истории computer science

25.01.2010

Несколько месяцев назад заинтересовался причинами появления управляющих кодов ASCII в их нынешнем виде. Раскопки привели меня к первым терминалам в Multics, терминалы — к телетайпам, телетайпы — к телеграфным аппаратам. Тема чрезвычайно интересная, но полноценного поста у меня так и не вышло по разным причинам. Просто накидаю сюда ссылок для интересующихся (в основном на английском).

Unix и его предшественники
Multicians.org — один из основных сайтов по предыстории Unix. В основном описывает различные аспекты ОС Multics (включая рекламную брошюру (4 Мб)), но содержит также массу сведений и о ранних вариантах Unix, и о CTSS.

Unix history — основной сайт по истории Unix.

Концепция иерархической файловой системы впервые была описана в 1965 году и сильно отличалась от ныне используемой. В частности, в качестве разделителя каталогово предлагалось использовать двоеточие, а на уровень выше можно было ссылаться как на *; у каждого файла присутствовал специальный атрибут TRAP, в котором можно было указать свою процедуру проверки прав доступа к этому файлу. Но уже в Multics реализация файловой системы значительно отличалась от данного проекта иной, а в Unix и вовсе приняла привычный нам вид.

The Evolution of the Unix Time-sharing System (Dennis M. Ritchie, 1979) — краткая история Unix, рассказанная одним из её создателей.

The Restoration of Early UNIX Artifacts — опыт восстановления файлов с древней ленты, содержащей один из самых первых релизов Unix. В конце документа несколько интересных ссылок.

Исходный код Unix — отсканированная распечатка тщательно прокомментированных ассемблерных кодов Unix. Датируется 1972 годом. 11 мегабайт.

Excavating ancient abbreviations in Linux ­— история происхождения некоторых аббревиатур, используемых в UNIX/Linux (для чтения оригинала требуется
регистрация, поэтому ссылка на кэш гугла).

Буду благодарен за PDF/DJVU версию книги «A quarter century of Unix» by Peter Salus :)

Терминалы
Коллекция информации о текстовых терминалах, отправная точка исследований.

Рассказ одного из создателей Multics о первых терминалах и опыте удалённой домашней работы (70-е годы, суперкрутые модемы на 1200 бод) (en)

Краткая история терминалов DEC (в т.ч. VT100)

Что такое «smart terminal» и чем он отличается от «dumb terminal». В
основном тем, что умеет проверять пользовательский ввод уже на стороне терминала, а не передаёт его серверу.

Телеграф
К вопросу о возникновении телеграфа множество интересных сведений из истории телеграфной связи

История телеграфа в России

Телеграфное дело. Пособие для сержантов и старших специалистов войск связи — раритет :) Книжка 1946 года выпуска, доступно и понятно описывает теорию электротехники и электроники по состоянию на момент окончания Великой Отечественной войны, а также знакомит читателя с основными понятиями телеграфной связи.

linux - 1 комментарий

Шпаргалка по созданию chroot-окружения в Debian средствами debootstrap

20.01.2010

Для тестирования различных версий нашего продукта (внутри — БД под управлением mysql и интерфейс к ней на PHP под Apache2) требуется быстро создавать многочисленные chroot-окружения на выделенном сервере и управляться с ними.

В базовой системе (lenny) оставляем только функционал, необходимый для управления всем хозяйством, лично мне необходимы mc, openssh, vim, bash_completion и иногда svn. Также неплохо поиметь где-нибудь (да хоть на этой же машине) кэширующий прокси для репозиториев debian, типа apt-proxy или apt-cacher, чтобы не создавать излишнюю нагрузку на региональные зеркала. У нас используется apt-cacher, работающий по адресу http://apt:3142.

Debootstrap ­— основная рабочая лошадка:

apt-get install debootstrap
debootstrap --include=mc,ssh,vim lenny /systems/lenny http://apt:3142/ftp.debian.org/debian/

Первый аргумент — название релиза, второй — путь, куда устанавливается система, третий — адрес репозитория. В опции –include через запятую указываются пакеты, которые необходимы, но не входят в минимальную базовую систему. Debootstrap выкачивает из репозитория и устанавливает минимальный набор пакетов, теоретически сразу после этого можно делать chroot /systems/lenny и переходить к работе, но осталась еще несколько немаловажных доделок:

Добавляем идентификатор системы, который будет отображаться в скобках в приглашении шелла (читай — bash), выполняемом в chroot-окружении:

echo lenny > /systems/lenny/etc/debian_chroot

Но работа в основном ведется от имени root, а в squeeze и sid у root’а в .bashrc переменная окружения PS1 переопределяется и этот идентификатор пропадает. Поэтому если делаем виртуалку squeeze, то строчку с PS1 в /root/.bashrc лучше закомментировать:

sed -i 's/^\(export PS1.*\)$/#\1/g' /systems/squeeze/root/.bashrc

Монтируем /dev/pts — виртуальную файловую систему, которая динамически создаёт файлы терминалов /dev/pts/X для каждого нового подключения; это необходимо для нормального функционирования многих программ, работающих с терминалом, в т.ч. скриптов postinst и config пакета mysql-server:

mount -t devpts devpts /systems/lenny/dev/pts

Монтируем /proc (реально proc в новом месте будет содержать ту же информацию, что и общесистемный /proc):

mount -t proc proc /systems/lenny/proc

Чтобы apt-get не ругался на неподписанные пакеты при установке, необходимо обновить файл Release.gpg, т.к. по умолчанию debootstrap его не устанавливает. Это проще всего сделать обновлением индексных файлов репозитория:

chroot /systems/lenny apt-get update

После этого уже можно делать chroot /systems/lenny, устанавливать и настраивать пакеты, запускать/останавливать сервисы и т.д. Главная проблема при этом ­— следить за тем, чтобы сервисы в разных chroot’ах не конфликтовали, пытаясь занять порт на одном IP-адресе. Обычно добавляются виртуальные сетевые интерфейсы и им назначаются виртуальные же IP-адреса, которые и указываются в настройках сервисов.

Disclaimer: данная заметка описывает мой персональный опыт и не претендует на полноту. Комментарии и дополнения приветствуются.

linux - 1 комментарий

Как не пропустить момент установки нового ядра с помощью команды watch

13.01.2010

Выдержка из man 1 watch (входит в комплект утилит procps в Debian Lenny):

You can watch for your administrator to install the latest kernel with

        watch uname -r

(Note that -p isn’t guaranteed to work across reboots, especially
in the face of ntpdate or other bootup time-changing mechanisms)

linux - 0 комментариев

Разделение аргументов в shebang

28.12.2009

В комментариях к прошлогоднему переводу Bash Pitfalls внимательный flavi задался вопросом, почему при попытке выполнить скрипт, в начале которого написано

#!/bin/bash --posix --verbose

выдаётся ошибка

/bin/bash: --posix --verbose: invalid option

в то время как в интерактивном режиме bash нормально запускается с такой комбинацией опций; более того, если в shebang’е оставить только одну из этих опций, то скрипт также запускается без ошибок.

Поначалу я предположил, что --posix запрещает опции, не определённые стандартом POSIX на sh. Но тогда попытка выполнить bash --posix --norc также приводила бы к ошибке, и конструкция #!/bin/bash --verbose --norc работала бы нормально, а это не так.

Пришлось разбираться более плотно. В bash (1) я вычитал следующее (выделение — моё):

If the program is a file beginning with #!, the remainder of the first line specifies an interpreter for the program. The shell executes the specified interpreter on operating systems that do not handle this executable format themselves. The arguments to the interpreter consist of a single optional argument following the interpreter name on the first line of the program, followed by the name of the program, followed by the command arguments, if any.

Т.е. в shebang можно задавать только один аргумент; кроме того, bash самостоятельно анализирует shebang и вызывает указанный интерпретатор только в случае, если система сама не может выполнить этот скрипт.

Сам файл передаётся на выполнение с помощью системного вызова execve (2) (это я вычитал в файле execute_cmd.c в исходном коде bash), в man-странице которого и разъясняется политика партии по поводу разбиения аргументов интерпретатора:

On Linux, the entire string following the interpreter name is passed as a single argument to the interpreter, and this string can include white space.

Таким образом, в самом первом примере у bash в argv оказывается не два аргумента --verbose и --norc, а один --verbose --norc, что и приводит к ошибке, и вина bash лишь в том, что он не разбивает свои аргументы на части, как это делает, например, Perl.

Причина такого странного поведения операционной системы (казалось бы, что сложного в том, чтобы просто разбить строку на части по пробелам или символам табуляции) описана, например, в этой дискуссии LKML или, более подробно, в письме Garance A Drosihn в рассылку freebsd-arch. Вкратце, если бы механизм механизм обработки shebang (в Linux — linux/fs/binfmt_script.c) передавал все аргументы интерпретатору, то для некоторых из них было бы затруднительно отделить аругменты интерпретатора от собственно аргументов вызываемого скрипта. По крайней мере, так было еще на заре развития Unix и с тех пор большая часть Unix-систем передаёт все аргументы как единую строку.

linux - 3 комментария

Басни про git

27.12.2009

Пытающимся отвыкнуть от идеологии CVS и SVN — рассказ о концепциях распределённых систем контроля версий.

Более подробное введение

ага, для ссылок есть твиттер и del.icio.us, но ЭТУ ссылку я уже однажды потерял. Так что пусть тут побудет, в назидание.

linux - 0 комментариев

Очередные мелочи Firefox

23.12.2009

Функция «detach tab», актуальная при наличии двух мониторов, в Firefox 3.0 (он же Iceweasel в Debian) в явном виде отсутствует, но хотя на пустое место вкладку перетащить нельзя (как, например, в gnome-terminal), работает простое перетаскивание вкладок между окнами. Таким образом, чтобы отделить вкладку в отдельное окно, нужно сначала создать это окно (Ctrl+N), сделать его видимым одновременно с основным и перетащить туда эту вкладку. В Firefox 3.5 для выделения вкладки в новое окно есть пункт «Open in a new window» в контекстном меню вкладки.

Чтобы в режиме fullscreen строка статуса всегда оставалась видимой, нужно создать файл настроек интерфейса %profiledir%/chrome/userChrome.css (или скопировать его из userChrome-example.css из той же папке) со следующим содержанием:

@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
#status-bar
{
	visibility: visible;
}

Ещё несколько примеров того, как можно настроить Firefox под себя без использования расширений.

linux - 0 комментариев

Ищем веб-разработчика в Нижнем Новгороде

01.12.2009

Требования: PHP или Python, SQL, JS, Flex (последнее не обязательно, но очень приветствуется).

Необходимо понимать и уметь применять на практике парадигму ООП, знать основные паттерны проектирования веб-приложений, желательно иметь опыт работы с веб-фреймворками.

Дополнительные требования: Linux, shell-скрипты; понимание принципов работы voip-технологий также будет несомненным плюсом.

Приветствуется опыт администрирования Linux, Apache, СУБД MySQL, Postgresql, Oracle.

Чуть подробнее тут.

Работа в офисе.

Зарплата по результатам собеседования (от 20 т.р.)

Резюме присылайте мне (адрес на специальной страничке) или прямо в отдел кадров с пометкой, откуда взяли :)

linux - 0 комментариев

Секретные операторы Perl

30.11.2009

Эскимосский превед }{, goatse НЛО =()=, телекоммуникационный спутник -+- и другие не менее осмысленные конструкции.

И вообще, блог good coders code, great reuse (англ.) более чем заслуживает того, чтобы на него подписаться.

linux - 0 комментариев

Занимательная математика с MySQL

06.11.2009

Коллега Алексей Аристов поделился парадоксом:

Server version: 5.0.51a-24+lenny1 (Debian)

mysql> select '0'=0;
+-------+
| '0'=0 |
+-------+
|     1 |
+-------+
1 row in set (0.00 sec)

mysql> select ''=0;
+------+
| 0='' |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> select ''='0';
+--------+
| ''='0' |
+--------+
|      0 |
+--------+
1 row in set (0.00 sec)

Если два значения равны третьему, они не равны между собой, что немного противоречит здравому смыслу. Однако такое поведение легко можно объяснить read more…

linux - 0 комментариев

Лицензия Windows 7 с точки зрения линуксоида

29.10.2009

Миллионы пользователей Windows, больше года ожидавшие выхода новой, теперь уже правильной (по сравнению с Vista) ОС от Microsoft, наконец счастливы: 22 октября начались продажи Windows 7. Из этих счастливцев самые радостные — добровольные бета-тестеры предварительных релизов, которым наравне со всеми рано или поздно придется приобрести один из вариантов семерки.

Последней версией windows, которой я активно пользовался, была XP, и я не видел ни Windows Vista, ни тем более Windows 7 (что за идиотское обозначение релиза: «7», его можно употреблять только в сочетании со словом windows. Похоже, концентрация «windows» в этом посте превысит все мыслимые пределы. Windows windows windows windows окна окна пластиковые окна, и закончу на этом). Но я слышал множество лестных отзывов о новой системе даже от бывалых линуксоидов. Более того, сам Линус Торвальдс в шутку сфотографировался на фоне точки продаж семерки. Что же это такое, надо, пожалуй, взглянуть, неужели и правда Microsoft сделала такой шаг вперед навстречу прогрессивному человечеству?

Но нельзя поставить систему на компьютер, не согласившись с лицензионным соглашением. Посмотрим, что же нам предлагает (точнее, запрещает) лицензионное соглашение для версии с максимальными возможностями (по-русски она так и называется — «максимальная», что, конечно же, не передаёт всех смысловых оттенков слова «Ultimate»). А в разделе «Примеры лицензионных соглашений» можно найти примерную OEM лицензию, которая, за исключением нескольких моментов, соответствует своей коробочной версии.
read more…

linux - 4 комментария

Заметки на память

07.09.2009

Если после перезагрузки не сохраняются параметры клавиатуры в Gnome-окружении Debian или Ubuntu, поможет добавление setxkbmap в приложения, запускаемые автоматически при входе в систему («Система — Параметры — Запускаемые приложения» или «System — Parameters — Sessions»)

Если при монтировании расшаренного через Samba каталога через mount.cifs симлинки отображаются как локальные ссылки, нужно на обеих машинах в smb.conf отключить unix extensions, которые и отвечают за такое поведение символических ссылок:

unix extensions = no

Если в Ubuntu одновременно перестали работать su, sudo, входы в систему с консоли и через ssh (основной симптом: зависает после ввода пароля), то для постановки окончательного дифференциального диагноза можно попробовать выполнить команду «logger test». Если и это зависает, то налицо проблема с демоном syslogd. В моем случае решение вылилось в отключении опции «-r» в/etc/default/syslogd (принимать сообщения по сети), которая однажды была добавлена мной для удаленной отладки одного voip-телефона. На самом деле это явная бага, которая, судя по Ubuntu Bug 26986, тянется аж с 2005 года.

linux - 1 комментарий

Ссылка на определенное место в man’е

24.08.2009

В блоге «Полезные советы по Linux» наткнулся на способ ссылаться на определенное место в документации:

sh -c 'PAGER="less" LESS="-p search_string" man man_page'

Явно вызываем sh, задаем просмотрщик less и указываем ему строку, которую нужно найти. Команда man запустит less и прокрутит экран до первого совпадения.

Конечно же, необходимо убедиться, что заданный шаблон присутствует в документе хотя бы один раз, и первый раз встречается именно в том месте, на которое вы хотите сослаться. Если ни одного совпадения не найдено, будет выведена ошибка и man будет показан с его начала, да и то только после нажатия Enter. Также стоит учитывать, что у адресата вашего сообщения может быть другой shell, другая версия документации и вообще другая операционная система.

Несколько примеров (предполагаем, что в качестве шелла используется sh-compatible shell типа bash или zsh, а переменная PAGER установлена в less).

Абзац в bash (1) про фичу complete-into-braces из одной из предыдущих заметок:

LESS="-p complete-into-braces" man bash

Раздел про подстановку из истории в bash (1). Поскольку строка HISTORY EXPANSION в документе встречается неоднократно, то требуется привязка к началу строки:

LESS='-p ^s*HISTORY EXPANSION' man bash

Подсветка важной фразы целиком:

LESS='-p Please note.*log the command[^.]*.' man sudo

Этот фокус можно задействовать в других утилитах, использующих less, например, в perldoc:

LESS='-p ^s*Range Operators' perldoc perlop

О том, как эта конструкция работает:

LESS='-p MANPAGER, PAGER' man man
LESS='-p -ppattern.*' man less
LESS='-p Options which.*' man less

linux - 2 комментария

Построение регулярного выражения по списку строк

18.08.2009

Имеется неколько десятков однотипных файлов вида FILE20090801011253.txt, FILE20090801023619.txt и т.д. Требуется составить регулярное выражение, которому удовлетворяют только названия файлов из списка.

Вручную это можно сделать примерно так:

FILE200908010(11253|23619)\.txt

Если файлов много, то никаких нервов не хватит высчитывать, проверять и перепроверять.

То же самое можно сделать полуавтоматически, с помощью механизма complete-into-braces оболочки bash. Сочетание клавиш Esc-{ преобразовывает список подстановки в более-менее оптимальный формат brace-completion, пригодный для дальнейшей обработки:

$ echo /path/to/dir/(Esc-{)FILE200908010{11253.txt,23619.txt}

Чтобы из получившейся строки сделать нормальный регэксп, нужно фигурные скобки заменить на круглые, а запятые — на вертикальную черту:

echo "FILE200908010{11253.txt,23619.txt} "|sed -e 's/{/(/g' -e 's/}/)/g' -e 's/,/|/g'

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

После непродолжительных поисков был найден Perl’овый модуль Regexp::List, функцию list2re (преобразование списка в регулярное выражение) из которого можно приспособить под любые подобные задачи. Вот, например, сокращенная версия скрипта для моего случая:

use Regexp::List;
my $l=Regexp::List->new;
$l->set(lookahead=>0);

opendir(D,"/path/to/dir") or die "Could not open $dir: $!";
my @list=grep {$_!~/^\.\.?$/ } readdir(D);          # get directory entries except "." and ".."
closedir(D);

my $re = $l->list2re(@list);                        # create regexp from @list
$re=~s/^\(\?-[xism]+:(.*?)\)$/^$1\$/g;              # strip "(?:-xism" and ")"
print "$re\n";

Для следующих десяти файлов:

FILE20090802120343.txt
FILE20090802165139.txt
FILE20090802181550.txt
FILE20090804014529.txt
FILE20090804140848.txt
FILE20090805103525.txt
FILE20090805104025.txt
FILE20090810083211.txt
FILE20090810120349.txt
FILE20090810121250.txt

Скрипт выдает такой результат:

^FILE200908(?:0(?:510(?:40|35)25\.txt|21(?:81550|20343|65139)\.txt|4(?:140848|014529)\.txt)|10(?:12(?:1250|0349)\.txt|083211\.txt))$

Что и требовалось.

Пользуясь случаем, хочу порекламировать PDF-версию третьего издания книги «Регулярные выражения» Джеффри Фридла

linux - 7 комментариев