Saturday, January 21, 2012

perlfaq3 — инструменты программирования http://beshenov.ru/perlfaq/3.html

http://beshenov.ru/perlfaq/3.html

perlfaq3 — инструменты программирования

Этот раздел FAQ отвечает на вопросы по инструментам для программистов и организации процесса написания программ.
Как мне сделать...
Как использовать Perl в интерактивном режиме?
Есть ли командная оболочка Perl?
Как узнать, какие модули установлены в системе?
Как отлаживать программы на Perl?
Как профилировать свои программы на Perl?
Как мне связать программы на Perl перекрестными ссылками?
Есть ли утилита для красивого форматирования исходников на Perl?
Есть ли ctags для Perl?
Есть ли IDE или специальный редактор для Perl?
Где найти макросы vi для Perl?
Где взять perl-mode для Emacs?
Как использовать curses в Perl?
Как написать графический интерфейс (X, Tk, Gtk, и т. д.) на Perl?
Как заставить свою программу на Perl работать быстрее?
Как заставить свою программу на Perl использовать меньше памяти?
Безопасно ли возвращать ссылку на локальные или лексические данные?
Как для экономии ресурсов освободить память, выделенную под массив или хеш?
Как сделать свой CGI-скрипт эффективнее?
Как скрыть исходный код своей программы на Perl?
Как собрать программу на Perl в байткод или C?
Как заставить #!perl работать в MS-DOS/NT/...?
Можно ли писать полезные программы на Perl в командной строке?
Почему однострочники Perl не работают у меня в DOS/Mac/VMS?
Где можно узнать о CGI- или веб-программировании на Perl?
Где можно узнать про объектно-ориентированное программирование на Perl?
Где узнать о связывании C и Perl?
Я прочитал perlembed, perlguts и прочее, но не могу встроить perl в свою программу на C; что я делаю не так?
Когда я попробовал запустить свой скрипт, я получил сообщение «...» Что это значит?
Что такое MakeMaker?

Как мне сделать...

Смотрели в CPAN? (Подробности — в perlfaq2.) Вероятно, что кто-то уже написал модуль, решающий вашу задачу. Смотрели соответствующие страницы руководства? Вот краткое содержание:
Основное: perldataperlvarperlsynperlopperlsub.
Запуск: perlrunperldebug.
Функции: perlfunc.
Объекты: perlrefperlmodperlobjperltie.
Структуры данных: perlrefperllolperldsc.
Модули: perlmodperlmodlibperlsub.
Регулярные выражения: perlreperlfuncperlopperllocale.
Переход на perl5: perltrapperl.
Взаимодействие с C: perlxstutperlxsperlcallperlgutsperlembed.
Разное: http://cpan.org/misc/olddoc/FMTEYEWTK.tgz (не страница руководства, но всё равно полезный набор заметок по поводу приемов работы на Perl).
Грубый перечень страниц руководства Perl есть в perltoc.

Как использовать Perl в интерактивном режиме?

Обычный подход — вызывать отладчик Perl, описанный в странице руководства perldebug, с «пустой» программой вроде такой:
perl -de 42
Теперь просто введите любой корректный код Perl, и он тут же будет исполнен. Можете также посмотреть таблицу символов, отследить содержимое стека, проверить значения переменных, задать точки останова и проделать другие операции, которые предоставляют символьные отладчики.

Есть ли командная оболочка Perl?

Perl Shell — оболочка, которая объединяет интерактивную оболочку Unix с мощью Perl. Цель проекта — получить полноценную среду, работающую, как обычная оболочка, но использующую синтаксис и функциональность Perl для управляющей логики программ и прочих вещей.
Zoidberg — похожий проект оболочки, написанной на Perl и управляемой perl. Он замысливался как пользовательский интерпретатор команд и среда разработки. Его можно найти на http://pardus-larus.student.utwente.nl/~pardus/projects/zoidberg/ или местном зеркале CPAN.
Модуль Shell.pm, распространяющийся вместе с Perl, пытается интерпретировать команды, которые не относятся к языку Perl, в качестве команд оболочки. perlsh из пакета с исходниками — примитивный и неинтересный, но тоже может подойти.

Как узнать, какие модули установлены в системе?

Можете использовать модуль ExtUtils::Installed, чтобы посмотреть, что установлено, но это волшебство может занять некоторое время. Стандартная библиотека, прилагающаяся к Perl, просто отображается как «Perl» (хотя это можно уточнить при помощи Module::CoreList).
use ExtUtils::Installed;  my $inst    = ExtUtils::Installed->new(); my @modules = $inst->modules();
Если нужен список всех файлов с модулями Perl, то можете использовать File::Find::Rule.
use File::Find::Rule;  my @files = File::Find::Rule->extras({follow => 1})->file()->name( '*.pm' )->in( @INC );
Если такого модуля у вас нет, то можете сделать то же самое с входящим в стандартную библиотекуFile::Find.
use File::Find; my @files;  find(     {         wanted => sub {         push @files, $File::Find::fullname             if -f $File::Find::fullname && /\.pm$/         },         follow => 1,         follow_skip => 2,     },     @INC );  print join "\n", @files;
Если нужно просто быстро посмотреть, доступен ли определенный модуль, то можно проверить его документацию. Если ее получается открыть, то модуль, скорее всего, установлен. Если документации нет, то для модуля ее может не быть (в редких случаях).
perldoc Module::Name
Также можно попробовать включить модуль в однострочник и проверить, находит ли его perl.
perl -MModule::Name -e1

Как отлаживать программы на Perl?

(Отвечает Брайан Д. Фой)
Перед тем, как что-то делать, следует убедиться, что вы позволили Perl сообщать о проблемных местах кода. Включив предупреждения и строгие правила, можно избавиться от многих проблем до того, как они перерастут во что-то серьезное; подробности смотрите в документации strict и warnings.
#!/usr/bin/perl use strict; use warnings;
Помимо этого, самый простой отладчик — функция print. Используйте ее, чтобы посмотреть значения во время работы программы:
print STDERR "The value is [$value]\n";
Модуль Data::Dumper дает хороший вывод структур данных Perl:
use Data::Dumper qw( Dumper ); print STDERR "The hash is " . Dumper( \%hash ) . "\n";
К Perl прилагается интерактивный отладчик, который можно запустить ключом -d. Полное описание есть вperldebug.
Если вам нужен графический интерфейс, и вы установили Tk, то можно использовать ptkdb; он есть в CPAN и бесплатен.
Если нужно что-то более сложное и управляемое, Devel::ebug Леона Брокара (с ключом -D можно запустить как -Debug) дает всяческие программные ловушки, которые требуются для написания своего отладчика (без особых мучений).
Также можете использовать платный отладчик вроде Affrus (для Mac OS X), Komodo от Activestate (для Windows и Mac OS X) и EPIC (для большинства платформ).

Как профилировать свои программы на Perl?

Нужно взять модуль Devel::DProf из стандартной поставки (или отдельно из CPAN), а также использоватьBenchmark.pm из стандартной поставки. Модуль Benchmark позволяет замерять исполнение конкретных участков кода, а Devel::DProf дает подробный анализ того, где код тратит время.
Пример использования Benchmark:
use Benchmark;  @junk = `cat /etc/motd`; $count = 10_000;  timethese($count, {     'map' => sub { my @a = @junk;                       map { s/a/b/ } @a;                       return @a },     'for' => sub { my @a = @junk;     for (@a) { s/a/b/ };     return @a }, });
Вот то, что выводится (на конкретном компьютере; ваши результаты будут зависеть от аппаратного обеспечения и загруженности системы):
Benchmark: timing 10000 iterations of for, map...      for:  4 secs ( 3.97 usr  0.01 sys =  3.98 cpu)      map:  6 secs ( 4.97 usr  0.00 sys =  4.97 cpu)
Имейте в виду, что хорошую контрольную задачу написать очень тяжело. Benchmark только проверяет переданные данные и мало чего показывает относительно различий в сложности алгоритмов.

Как мне связать программы на Perl перекрестными ссылками?

Модуль B::Xref создает связанные отчеты по программам на Perl.
perl -MO=Xref[,OPTIONS] scriptname.plx

Есть ли утилита для красивого форматирования исходников на Perl?

Perltidy — скрипт, выравнивающий и форматирующий код на Perl, чтобы сделать его более читаемым. Он пытается следовать правилам perlstyle. Если вы пишете скрипты на Perl или проводите много времени за их чтением, то может пригодиться.
Конечно, если вы просто следуете руководствам perlstyle, то ничего заново форматировать не нужно. Привычка форматировать код при написании поможет предотвратить ошибки. Текстовый редактор может и должен помочь вам с этим. perl-mode или более новый cperl-mode для Emacs значительно всё упрощает. Том Кристиансен и многие другие пользователи vi (и аналогов) могут обратиться к следующим настройкам:
set ai sw=4 map! ^O {^M}^[O^T
Запишите это в свой файл .exrc (знаки вставки замените контрольными символами) и можете работать. Как обычно, в режиме вставки ^T — для отступа, ^D — для удаления отступа, ^O — для выравнивания блока. Более полный пример с комментариями — http://cpan.org/authors/id/TOMC/scripts/toms.exrc.gz
Многие вещи, связанные с красивым выводом документов на печать, делает a2ps.

Есть ли ctags для Perl?

(Отвечает Брайан Д. Фой)
ctags использует таблицу для быстрого поиска по исходному коду, многие популярные редакторы поддерживают ctags для различных языков, в том числе Perl.
Perl поддерживает реализация Exuberent Ctags.
Также можете посмотреть pltags.

Есть ли IDE или специальный редактор для Perl?

Программы на Perl имеют простой текстовый формат, поэтому подойдет любой редактор.
Если используете Unix, то у вас уже есть IDE — сам Unix. Философия Unix опирается на множество небольших инструментов, каждый из которых хорошо решает свою задачу. Это как столярный ящик с инструментами.
Если хотите IDE, то посмотрите вот эти (перечисляем в алфавитном порядке, а не в порядке предпочтения):
Eclipse Perl Integration — проект по внедрению редактора и отладчика Perl в Eclipse.
Enginsite — полноценная IDE для создания, отладки и тестирования скриптов Perl; работает в Windows 9x/NT/2000/XP.
Komodo — кроссплатформенная (на октябрь 2004 г. поддерживается Windows, Linux и Solaris) и многоязыковая IDE от ActiveState с поддержкой Perl, включающая отладку регулярных выражений и удаленную отладку.
Open Perl IDE — среда разработки, встроенная в поставку ActivePerl для Windows 95/98/NT/2000.
OptiPerl — IDE для Windows с эмуляцией среды CGI, отладчиком и редактором с подсветкой синтаксиса.
PerlBuilder — для Windows.
visiPerl+ — для Windows.
Visual Perl — плагин для Visual Studio.NET, разработанный ActiveState.
Zeus — очередной многоязыковой редактор для Win32, поддерживающий Perl.
Что касается редакторов: если вы используете Unix, то, скорее всего, у вас уже есть vi или его аналог, а может и Emacs, поэтому ничего загружать вам не нужно. В любом Emacs, пожалуй, лучший режим для Perl среди всех редакторов, дает cperl-mode (M-x cperl-mode).
Если вы в Windows, то можете использовать любой редактор, позволяющий работать с простым текстом, такой как NotePad или WordPad. Текстовые процессоры вроде Microsoft Word и WordPerfect обычно не подходят, потому что вставляют самую разную побочную информацию, хотя некоторые и позволяют сохранять файлы как «простой текст». Вы также можете загрузить специальные текстовые редакторы для программистов вроде Textpad и UltraEdit.
То же самое относится к MacOS. MacPerl (для классической среды) идет вместе с простым редактором. Популярны BBEdit и Alpha. Пользователи MacOS X также могут использовать редакторы Unix:
GNU Emacs,
MicroEmacs,
XEmacs,
Jed.
или аналоги vi:
Elvis,
Vile,
Vim.
Для любителей vi, в Windows или где-то еще: http://thomer.com/vi/vi.html
nvi (есть в CPAN в src/misc/) — очередной аналог vi, к сожалению, не доступный для Windows, но в UNIX его стоит попробовать, потому что это не полная копия vi, а новая версия; также в него можно встраивать Perl и применять как язык скриптования. Хотя здесь nvi не одинок: по крайней мере, vim и vile имеют встроенную поддержку Perl.
Следующие многоязыковые редакторы / IDE для Win32 поддерживают Perl:
Codewright,
MultiEdit,
SlickEdit.
Редактор toyedit, основанный на компоненте Text и написанный на Perl, прилагается к модулю Tk в CPAN.ptkdb — отладчик на Perl/Tk, работающий и в качестве некоторой среды разработки. Perl Composer — IDE для создания графических интерфейсов Perl/Tk.
В дополнение к редакторам и средам разработки, может пригодиться более мощная командная оболочка для Win32. Возможные варианты:
Bash из пакета Cygwin,
Ksh из MKS,
Bourne shell из среды U/WIN,
Tcsh (см. также http://www.kitebird.com/csh-tcsh-book/),
Zsh.
MKS — платная, U/WIN — бесплатная только для образовательной и исследовательской деятельности, Cygwin лицензирован GPL (но это никак не затрагивает использование Perl). Cygwin, MKS и U/WIN предоставляют, помимо командного интерпретатора, обширный набор утилит стандартного инструментария UNIX.
Если вы передаете текстовые файлы по FTP между Unix и Windows, то убедитесь, что используете режим ASCII, и концы строк правильно преобразуются.
В Mac OS к MacPerl прилагается маленький и простенький текстовый редактор (до 32k), работающий как урезанная IDE. MPW Perl может использовать MPW Shell в качестве редактора (без ограничения в 32k).
Affrus — полноценная IDE с поддержкой отладчика.
Alpha — редактор, написанный на Tcl, однако имеющий поддержку ряда распространенных языков разметки и программирования, в том числе Perl и HTML.
BBEdit и BBEdit Lite — текстовые редакторы для Mac OS с подсветкой Perl.

Где найти макросы vi для Perl?

Полная версия файла настроек vi Тома Кристиансена находится по адресуhttp://cpan.org/authors/Tom_Christiansen/scripts/toms.exrc.gz, это стандартный тест для эмуляторов vi. Файл лучше всего работает в nvi — текущей версии vi из Беркли, которую, между прочим, можно собрать со встроенным интерпретатором Perl; см. http://cpan.org/src/misc/.

Где взять perl-mode для Emacs?

Начиная с Emacs 19.22 (или вроде того), есть perl-mode.el и встроенная поддержка отладчика Perl. Это должно входить в стандартную поставку Emacs 19.
В пакете с исходниками perl есть директория Emacs, в которой можно найти cperl-mode для подсветки ключевых слов, контекстной помощи и прочих крутых штук.
Заметьте, что perl-mode для Emacs будет иметь проблемы с «main'foo» (с одиночной кавычкой) — выравнивание и подсветка будут приходить в беспорядок. В новом коде на Perl вы, скорее всего, используете «main::foo», поэтому для вас это не должно быть проблемой.

Как использовать curses в Perl?

Модуль Curses из CPAN предоставляет динамически загружаемый модульно-объектный интерфейс к библиотеке curses. Небольшой пример есть в каталогеhttp://cpan.org/authors/Tom_Christiansen/scripts/rep.gz — эта программа повторяет команду и при необходимости обновляет экран, обрабатывая в духе top вывод rep ps axu.

Как написать графический интерфейс (X, Tk, Gtk, и т. д.) на Perl?

(Отвечает Бен Морроу)
Существует ряд модулей, позволяющих писать графические интерфейсы на Perl. Большинство инструментариев имеют интерфейс на Perl, ниже следует неполный перечень.
Tk
Работает в Unix и Windows; в Windows выглядит уже не так похо, как раньше. Однако с некоторыми графическими элементами еще не очень хорошо. Интерфейс очень привычный и «перловый», поэтому его легко использовать в небольших скриптах, которым нужен простой графический интерфейс. Tk долгое время не обновлялся.
Wx
Обертка для Perl к кроссплатформенной библиотеке wxWidgets. Она работает в Unix, Win32 и Max OS X, используя родные компоненты систем (в Unix — GTK). Интерфейс близок к интерфейсу на C++, и для тех, кто не знаком с библиотекой, документация покажется довольно скупой, потому что отсылает к документации для C++.
GTK и GTK2
Обертки к библиотеке GTK. Интерфейс сильно поменялся от первой версии ко второй, поэтому разные ветки разработки представляются разными модулями Perl. Библиотека работает в Unix, Win32 и Mac OS X (в Mac OS требует X-сервер, но родной порт на подходе), компоненты выглядят одинаково на каждой платформе — то есть, не похожи на родные компоненты системы. Как и в Wx, интерфейс Perl следует интерфейсу для C, и, чтобы разобраться в библиотеке, потребуется прочесть документацию для C.
Win32::GUI
Предоставляет доступ к большинству графических компонентов Win32 из Perl. Очевидно, работает только в Win32 и с родными компонентами. Интерфейс Perl не особенно следует интерфейсу C, он более «перловый», и документация довольно хорошая. Более продвинутые вещи могут потребовать знакомства с Win32 API на C или обращения к MSDN.
CamelBones
Обертка на Perl для библиотеки Mac OS X Cocoa, которую можно использовать для создания родных графических интерфейсов Mac OS X. Ее нет в CPAN, потому что она зависит от библиотек, которые CPAN.pm не может устанавливать, однако используется стандартный установщик пакетов OS X. Интерфейс на Perl, опять же, близок к исходному интерфейсу на ObjC, и документация лишь говорит, как код Perl переводится на ObjC.
Qt
Интерфейс для TrollTech Qt, но, кажется, он не поддерживается.
Athena
Sx — интерфейс для набора компонентов Athena, поставляющегося с X, но, видимо, он также сейчас не поддерживается.

Как заставить свою программу на Perl работать быстрее?

Лучший способ это сделать — использовать лучшие алгоритмы. Часто это вносит колоссальное различие. Также хорошие замечания по оптимизации есть в книге Йона Бентли «Programming Pearls». Совет по тестированию таков: посмотрите контрольные задачи и поработайте с профайлером, чтобы убедиться, что оптимизируете нужное место; вместо правки незначительных деталей, поищите более хорошие алгоритмы; если ничего не помогает, просто подумайте о покупке железа помощней. Также смотрите выше ответ на вопрос «Как профилировать свои программы на Perl?»
Другой подход — автоматически загружать редко используемый код Perl. Для этого обратитесь к модулям AutoSplit и AutoLoader из стандартной поставки. Кроме того, можно определить критические места и обдумать их перенос на C (как мы привыкли определять критические места кода на C и переносить их на ассемблер). Аналогично, на C могут быть написаны модули с критическими местами (например, PDL из CPAN).
Если вы связываете исполняемый файл perl с разделяемой библиотекой libc.so, то можете пересобрать его для связывания со статической libc.a и тем самым повысить производительность на 10–25%. Это сделает исполняемый файл perl больше, но программы на Perl (и программисты) будут довольны. Для подробностей смотрите INSTALL в пакете с исходниками perl
Древняя попытка ускорения программ на Perl при помощи сохранения на диск уже скомпилированного кода — программа undump. Это уже непригодное решение, потому что оно работало на немногих архитектурах и вообще не отличалось качеством.

Как заставить свою программу на Perl использовать меньше памяти?

Если встает вопрос о компромиссе между пространством и временем, то Perl почти всегда предпочитает использовать память. Скаляры Perl занимают больше места, чем строки в C, массивы — больше, хеши — еще больше. Хотя еще многое стоит сделать, последние версии обращаются к этим проблемам. Например, начиная с 5.004, одинаковые ключи используются совместно всеми хешами, поэтому не требуют перераспределения памяти.
В некоторых случаях может быть очень полезным использование substr() или vec() для моделирования массивов. Например, массив из тысячи булевых переменных займет по меньшей мере 20 000 байт, но он может быть оформлен в 125-байтный вектор — экономия памяти значительная. Стандартный модульTie::SubstrHash может быть полезен для определенных типов структур данных. Если вы работаете с особыми стуктурами (например, матрицами), то модули, реализующие их на C, могут использовать меньше памяти, чем сходные модули на Perl.
Также стоит посмотреть, собран ли perl с системным malloc или своим встроенным. Какой бы ни использовался, попробуйте использовать другой и посмотреть, есть ли разница. Информация о malloc есть в файле INSTALL пакета с исходниками. Проверить, используется ли malloc от perl, можно также при помощиperl -V:usemymalloc.
Конечно, лучший способ сохранить память — не делать всё возможное, чтобы расходовать ее на первых порах. Хорошие приемы программирования могут идти к этому довольно длинным путем.

Не считывайте всё сразу!

Не считывайте в память файл целиком, если можете обработать его построчно. Конкретно — используйте цикл вроде такого:
# # Хорошо # while (<FILE>) {    # ... }
вместо этого:
# # Плохо # @data = <FILE>; foreach (@data) {     # ... }
Если обрабатываемые файлы маленькие, то особой разницы нет, как вы это делаете; если файлы становятся больше, то разница огромная.

Применяйте map и grep избирательно

Помните о том, что map и grep ожидают списковый аргумент, поэтому код
@wanted = grep {/pattern/} <FILE>;
приведет к считыванию файла целиком. Для больших файлов лучше использовать цикл:
while (<FILE>) {     push(@wanted, $_) if /pattern/; }

Избегайте ненужных кавычек и преобразований в строки

Не заключайте в кавычки большие строки, если этого не требуется:
my $copy = "$large_string";
делает две копии $large_string (одна для $copy, другая — для кавычек), в то время как
my $copy = $large_string;
— только одну копию.
Аналогично, для перевода больших массивов в строки
{     local $, = "\n";     print @big_array; }
более эффективно с точки зрения расхода памяти, нежели
print join "\n", @big_array;
или
{     local $" = "\n";     print "@big_array"; }

Передавайте по ссылке

Передавайте массивы и хеши по ссылке, а не по значению. С одной стороны, это единственный способ передать несколько списков или хешей (или то и другое) в одном вызове-возврате. Также это предотвращает копирование всего содержимого. С другой стороны, нужно учитывать, что при этом все изменения сказываются на переданных данных. Если действительно хотите попортить (эм, изменить) копию, то вы жертвуете на нее память.

Сбрасывайте большие переменные на диск

Для больших объемов данных, которые выходят за рамки доступной памяти, используйте один из модулей БД, чтобы хранить их на диске, а не в RAM. Это сказывается на времени доступа, но, возможно, лучше, чем обращаться к жесткому диску из-за интенсивной работы с виртуальной памятью.

Безопасно ли возвращать ссылку на локальные или лексические данные?

Да. Система сборки мусора Perl позаботится о том, чтобы всё было в порядке.
sub makeone {     my @a = ( 1 .. 10 );     return \@a; }  for ( 1 .. 10 ) {     push @many, makeone(); }  print $many[4][5], "\n";  print "@many\n";

Как для экономии ресурсов освободить память, выделенную под массив или хеш?

(Отвечает Майкл Карман)
Обычно никак. Память, выделенная для лексических данных (то есть, переменных my()), не может быть освобождена или повторно использована, если они выходят за область действия. Она сохраняется на случай, если переменные вернутся в область действия. Память, выделенная для глобальных переменных, может быть повторно использована при помощи undef() и/или delete().
В большинстве операционных систем выделенная для программы память не может быть возвращена обратно. Поэтому программы, работающие продолжительное время, иногда себя перезапускают. Некоторые операционные системы (в частности, те, которые используют mmap (2) для выделения больших блоков памяти) могут забирать память, которая больше не используется, но в таких системах perl должен быть настроен и собран, чтобы использовать системный malloc, а не собственный.
В общем, выделение и освобождение памяти — не то, о чем вы можете или должны особо заботиться в Perl.
См. также «Как заставить свою программу на Perl использовать меньше памяти?»

Как сделать свой CGI-скрипт эффективнее?

Помимо обычных средств для ускорения и уменьшения обычных программ Perl, для CGI-скриптов есть свои особенности. Они могут запускаться несколько раз в секунду. Они представляют большие трудности, если каждый запуск должны перекомпилироваться и часто повторно выделять мегабайт системной памяти и больше. Компиляция в C не поможет, потому что узкое место — затраты на запуск процесса.
Есть два распространенных способа избежать затраты: работать с HTTP-сервером Apache с расширениямиmod_perl или mod_fastcgi.
С mod_perl и модулем Apache::Registry (распространяется с mod_perlhttpd будет работать со встроенным интерпретатором Perl, который предварительно собирает скрипт, а потом исполняет в том же адресном пространстве без создания копии процесса. Расширение для Apache также дает Perl доступ к внутреннему API сервера, поэтому написанные на Perl модули могут делать то же самое, что и модули, написанные на C.
С модулем FCGI (из CPAN) и mod_fastcgi каждая из ваших программ на Perl станет постоянным процессом демона CGI.
Оба решения могут оказать серьезное влияние на систему и ваш стиль написания CGI-программ, поэтому внимательно изучите их.

Как скрыть исходный код своей программы на Perl?

Удалите ее :-) Если серьезно, то есть ряд (по большей части неудовлетворительных) решений с различным уровнем «секретности».
Во-первых, вы не можете убрать разрешение на чтение скрипта, потому что исходный код должен считываться, чтобы компилироваться и интерпретироваться. (Однако это не означает, что исходники CGI-скрипта видят посетители сайта — видят только те, у кого есть доступ к файловой системе.) Так что придется оставить дружественные для окружающих права 0755.
Некоторые считают это проблемой безопасности. Если программа имеет дыры в безопасности и полагается на то, что люди не знают, как их использовать, то это небезопасно. Обычно возможно найти эти дыры и использовать их, не заглядывая в исходный код. Безопасность, обеспечиваемая тем, что ошибки не исправляются, а скрываются — несерьезная безопасность.
Можете попробовать шифрование фильтрами исходного кода (начиная с Perl 5.8, модули Filter::Simple иFilter::Util::Call входят в стандартную поставку), но любой хороший программист сможет это дешифровать. Можете использовать компилятор байткода, описанный ниже в этом FAQ, но заинтересованные люди всё равно смогут всё декомпилировать. Можете попробовать описанный ниже компилятор в исполняемый код, но хакеры смогут его дизассемблировать. Эти подходы имеют разный уровень сложности получения кода, и ни один их них не прячет код полностью (это справедливо для всех языков, а не только для Perl).
Восстановить исходники программ на Perl очень просто — нужно только передать программу интерпретатору perl и использовать модули семейства B::B::Deparse должен справиться с любыми попытками спрятать исходный код. Опять же, это не особенность Perl.
Если не хотите, чтобы люди наживались на вашем коде, то, в конечном итоге, ничто не обеспечит правовую безопасность, помимо ограниченной лицензии. Добавьте к программе лицензию и приправьте ее угрожающими выражениями в духе «Это неопубликованный запатентованный код корпорации XYZ. Ваш доступ к нему не дает вам право его использовать и всё-такое-прочее». Мы, конечно, не адвокаты, поэтому вам нужно проконсультироваться с экспертом, если хотите быть уверенными, что формулировки в лицензии будут иметь силу в суде.

Как собрать программу на Perl в байткод или C?

(Отвечает Брайан Д. Фой)
В целом, это нельзя сделать. Хотя есть некоторые штуки, которые могут помочь в вашей ситуации. Обычно люди задают такой вопрос, потому что хотят распространять программы, не раздавая исходники, и большинство решений меняют дисковое пространство на удобство. Также вы не увидите большого прироста в скорости, потому как большинство решений включают в конечный продукт интерпретатор Perl (см. ответ на вопрос «Как заставить свою программу на Perl работать быстрее?»).
Perl Archive Toolkit — аналог JAR для Perl. Он свободно доступен на CPAN: http://search.cpan.org/dist/PAR/.
Также есть ряд коммерческих продуктов, которые могут оказаться полезными, хотя и придется купить лицензию.
Perl Dev Kit от ActiveState может «превратить программы на Perl в готовые для запуска бинарники HP-UX, Linux, Solaris и Windows».
Perl2Exe — программа командной строки для преобразования скриптов Perl в запускаемые файлы. Она поддерживает как Windows, так и Unix.

Как заставить #!perl работать в MS-DOS/NT/...?

В OS/2 просто используйте
extproc perl -S -your_switches
как первую строчку файла *.cmd (-S — из-за бага в том, как cmd.exe обрабатывает «extproc»). В DOS нужно сделать соответствующий пакетный файл и прописать его в ALTERNATE_SHEBANG (дополнительную информацию см. в dosish.h из исходников perl).
В Win95/NT, если используется порт ActiveState, в реестр будут внесены изменения, связывающие расширение .pl с интерпретатором perl. Если используете другой порт или даже собираете perl из исходников при помощи порта GCC (вроде Cygwin или MinGW32), то реестр нужно поменять самостоятельно. Помимо связывания .pl с интерпретатором, пользователи NT могут использовать SET PATHEXT=%PATHEXT%;.PLдля запуска программы install-linux.pl просто как install-linux.
В «классической» MacOS для программы perl установлен соответствующий создатель и тип, поэтому двойной щелчок вызывает MacPerl. В Mac OS X приложения, вызываемые щелчком, можно сделать из любого скрипта с#!, используя утилиту DropScript Вила Санчеза.
Внимание: что бы вы ни делали, не отчаивайтесь и не запихивайте perl в директорию cgi-bin, чтобы программы работали на веб-сервере. Это очень рискованно с точки зрения безопасности. Потратьте время на то, чтобы разобраться, как сделать всё правильно.

Можно ли писать полезные программы на Perl в командной строке?

Да. См. perlrun. Ниже некоторые примеры (предполагается, что используются правила экранирования оболочки Unix).
# Суммирование первой и последней записи perl -lane 'print $F[0] + $F[-1]' *  # Определение текстовых файлов perl -le 'for(@ARGV) {print if -f && -T _}' *  # Удаление (большей части) комментариев в программе на C perl -0777 -pe 's{/\*.*?\*/}{}gs' foo.c  # Создание файла на младше месяц, чем сегодня — чтобы обмануть обходящих каталоги демонов perl -e '$X=24*60*60; utime(time(),time() + 30 * $X,@ARGV)' *  # Поиск первого неиспользованного UID perl -le '$i++ while getpwuid($i); print $i'  # Отображение подходящего пути к файлам руководства echo $PATH | perl -nl -072 -e '     s![^/+]*$!man!&&-d&&!$s{$_}++&&push@m,$_;END{print"@m"}'
Ну хорошо, последнее было с Конкурса непонятных исходников :-)

Почему однострочники Perl не работают у меня в DOS/Mac/VMS?

Обычно, проблема в том, что командные интерпретаторы этих систем используют другое экранирование специальных символов, нежели оболочки Unix, для которых создавались однострочники. В некоторых системах можно заменить одиночные кавычки на двойные, но вы не должны делать это в Unix или Plan9. Также нужно поменять одиночный % на %%.
Примеры:
# Unix (в том числе Mac OS X) perl -e 'print "Hello world\n"'  # DOS и прочее perl -e "print \"Hello world\n\""  # Классический Mac print "Hello world\n" (потом запустите "Myscript" или Shift-Command-R)  # MPW perl -e 'print "Hello world\n"'  # VMS perl -e "print ""Hello world\n"""
Ни один из этих примеров не является надежным: все зависят от командного интерпретатора. В Unix часто работают первые два. В DOS очень возможно, что ни один не будет работать. Если командная оболочка — 4DOS, то, скорее всего, лучше что-то в таком духе:
perl -e "print <Ctrl-x>"Hello world\n<Ctrl-x>""
В Mac всё зависит от используемой среды. Оболочка MacPerl (MPW) работает как оболочки Unix и поддерживает различные кавычки, но позволяет свободно использовать не-ASCII символы Mac в качестве контрольных.
Использование qq()q() и qx() вместо "двойных кавычек"'одиночных кавычек', и `обратных штрихов` может облегчить написание однострочников.
Общего рецепта тут нет. С этим путаница.
(Часть ответа написана Кеннетом Альбановски.)

Где можно узнать о CGI- или веб-программировании на Perl?

Что касается модулей — загрузите CGI или LWP из CPAN. Что касается литературы — смотрите в разделе FAQ о книгах ту, что относится к WWW. Ответы на вопросы вроде «Почему я получаю ошибки 500?» или «Почему скрипт неправильно работает в браузере, если правильно работает в командной строке?» есть в руководствах по устранению ошибок и справочных материалах: perlfaq9 или CGI MetaFAQ.

Где можно узнать про объектно-ориентированное программирование на Perl?

Начать хорошо с perltoot, также можно посмотреть perlobjperlbootperltootperltooc и perlbot — в качестве справочного руководства.
Хорошая книга про объектно-ориентированное программирование на Perl — «Object-Oriented Perl» Дамиана Конвея, вышедшая в Manning, или «Intermediate Perl» Рэндала Шварца, Брайана Д. Фоя и Тома Феникса, вышедшая в O'Reilly.

Где узнать о связывании C и Perl?

Если хотите вызывать C из Perl, то начните с perlxstut, а потом изучите perlxsxsubpp и perlguts. Если хотите вызывать Perl из C, то смотрите perlembedperlcall и perlguts. Не забывайте о том, что многое можно узнать, глядя на то, как авторы имеющихся расширений писали код и решали свои задачи.
Вся мощь XS может не понадобиться. Модуль Inline::C позволяет помещать код C прямо в исходники Perl. Он берет на себя всю магию, заставляющую это работать. Нужно будет хотя бы немного знать perl API, но не придется иметь дело со сложными файлами поддержки XS.

Я прочитал perlembed, perlguts и прочее, но не могу встроить perl в свою программу на C; что я делаю не так?

Загрузите из CPAN пакет ExtUtils::Embed и запустите make test. Если тесты проходят, то перечитайте документацию снова и снова. Если тесты не проходят, то смотрите perlbug и отправьте сообщение об ошибке с выводом make test TEST_VERBOSE=1 и perl -V.

Когда я попробовал запустить свой скрипт, я получил сообщение «...» Что это значит?

Полный список сообщений об ошибках и предупреждений Perl с пояснениями есть в perldiag. Можете также использовать программу splain, прилагающуюся к Perl, чтобы получить объяснение сообщения об ошибке:
perl program 2>diag.out splain [-v] [-p] diag.out
либо внесите изменения в код, чтобы сообщения объяснялись:
use diagnostics;
или
use diagnostics -verbose;

Что такое MakeMaker?

(Отвечает Брайан Д. Фой)
Модуль ExtUtils::MakeMaker, чаще просто «MakeMaker», преобразует скрипт Perl, обычно называемыйMakefile.PL, в Makefile. Команда Unix make использует этот файл для управления зависимостями и действиями по обработке и установке пакета Perl.

4 comments:

  1. This is a fantastic website and I can not recommend you guys enough.

    notepad++ mac


    ReplyDelete
  2. Great Information sharing .. I am very happy to read this article .. thanks for giving us go through info.Fantastic nice. I appreciate this post.

    facetimeappfree.com

    ReplyDelete
  3. I adore your websites way of raising the awareness on your readers.rice purity test

    ReplyDelete
  4. I'm happy to see the considerable subtle element here!focus groups nyc

    ReplyDelete