perlfaq3
СОДЕРЖАНИЕ
- ИМЯ
- ВЕРСИЯ
- ОПИСАНИЕ
- Как выполнить (любое) действие?
- Как использовать Perl интерактивно?
- Как найти установленные модули на моей системе?
- Как отладить мои программы Perl?
- Как профилировать мои программы Perl?
- Как выполнить перекрестную проверку моих программ Perl?
- Существует ли красивое форматирование (форматировщик) для Perl?
- Существует ли IDE или редактор Perl для Windows?
- Где получить макросы Perl для vi?
- Где получить perl-mode или cperl-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?
- АВТОР И АВТОРСКИЕ ПРАВА
ИМЯ
perlfaq3 - Инструменты программирования
ВЕРСИЯ
версия 5.20210411
ОПИСАНИЕ
Этот раздел FAQ отвечает на вопросы, связанные с инструментами программистов и поддержкой программирования.
Как выполнить (любое) действие?
Вы смотрели CPAN (см. perlfaq2)? Вероятность того, что кто-то уже написал модуль, который может решить вашу проблему, высока. Вы читали соответствующие страницы справки? Вот краткий указатель:
- Основы
-
- perldata - Типы данных Perl
- perlvar - Предварительно определенные переменные Perl
- perlsyn - Синтаксис Perl
- perlop - Операторы Perl и приоритет
- perlsub - Подпрограммы Perl
- Выполнение
-
- perlrun - как выполнить интерпретатор Perl
- perldebug - Отладка Perl
- Функции
-
- perlfunc - Встроенные функции Perl
- Объекты
-
- perlref - Ссылки Perl и вложенные структуры данных
- perlmod - Модули Perl (пакеты и таблицы символов)
- perlobj - Объекты Perl
- perltie - как скрыть класс объекта в простой переменной
- Структуры данных
-
- perlref - Ссылки Perl и вложенные структуры данных
- perllol - Обработка массивов массивов в Perl
- perldsc - Справочник по структурам данных Perl
- Модули
-
- perlmod - Модули Perl (пакеты и таблицы символов)
- perlmodlib - создание новых модулей Perl и поиск существующих
- Регулярные выражения
-
- perlre - Регулярные выражения Perl
- perlfunc - Встроенные функции Perl>
- perlop - Операторы Perl и приоритет
- perllocale - Обработка локалей Perl (международная и локализация)
- Переход к perl5
-
- perltrap - Ловушки Perl для неопытных
- perl
- Связывание с C
-
- perlxstut - Руководство по написанию XSUB
- perlxs - Справочник по языку XS
- perlcall - Вызов Perl из C
- perlguts - Введение в API Perl
- perlembed - как встроить Perl в вашу программу C
- Разное
-
http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz (не страница справки, но все равно полезно, сборник различных эссе по Perl)
Подробный оглавление для набора страниц справки Perl находится в perltoc.
Как использовать Perl интерактивно?
Типичный подход использует отладчик Perl, описанный в справочном руководстве perldebug(1), в программе "без параметров", как в этом примере:
perl -de 42 Теперь просто введите любой допустимый код Perl, и он будет немедленно оценен. Вы также можете просмотреть таблицу символов, получить трассировку стека, проверить значения переменных, установить точки останова и другие операции, обычно встречающиеся в символьных отладчиках.
Вы также можете использовать Devel::REPL, который представляет собой интерактивную оболочку для Perl, обычно известную как REPL - Read, Evaluate, Print, Loop. Он предоставляет различные удобные функции.
Как найти установленные модули на моей системе?
Из командной строки вы можете использовать команду cpan с переключателем -l.
$ cpan -l Также вы можете использовать cpan с переключателем -a для создания файла autobundle, который CPAN.pm понимает и может использовать для повторной установки каждого модуля:
$ cpan -a Внутри программы Perl вы можете использовать модуль 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 (Если вы не получаете ошибку "Can't locate ... in @INC", значит Perl нашёл запрошенное имя модуля.)
Как отладить мои программы Perl?
(предоставлено brian d foy)
Прежде всего, вы можете помочь себе, убедившись, что 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 и доступен бесплатно.
Если вам нужно что-то намного более сложное и управляемое, отладчик Leon Brocard's Devel::ebug (который вы можете вызвать с переключателем -D как -Debug) предоставляет программируемые возможности для всего необходимого, чтобы написать свой собственный (без особых трудностей).
Вы также можете использовать коммерческий отладчик, такой как Affrus (Mac OS X), Komodo от Activestate (Windows и Mac OS X) или EPIC (большинство платформ).
Как профилировать мои программы Perl?
(сотрудничеством brian d foy, обновлено пт 25 июля 12:22:26 PDT 2008)
Пространство имен Devel содержит несколько модулей, которые можно использовать для профилирования ваших программ Perl.
Модуль Devel::NYTProf (профилировщик New York Times) выполняет профилирование как инструкций, так и подпрограмм. Он доступен на CPAN и его также можно вызвать с переключателем -d:
perl -d:NYTProf some_perl.pl Он создаёт базу данных информации о профилировании, которую можно преобразовать в отчёты. Команда nytprofhtml преобразует данные в отчёт HTML, похожий на отчёт Devel::Cover:
nytprofhtml Вам также может быть интересно использовать Benchmark для измерения и сравнения фрагментов кода.
Подробнее о профилировании можно узнать в главе 20 книги Programming Perl или главе 5 книги Mastering Perl.
perldebguts описывает создание пользовательского отладчика, если вам нужно создать специальный тип профилировщика. brian d foy описывает этот процесс в The Perl Journal, в статьях "Создание отладчика Perl" http://www.ddj.com/184404522 и "Профилирование в Perl" http://www.ddj.com/184404580.
Perl.com содержит две интересные статьи о профилировании: "Профилирование Perl" Саймона Козенса https://www.perl.com/pub/2004/06/25/profiling.html/ и "Отладка и профилирование приложений mod_perl" Франка Уайлса http://www.perl.com/pub/a/2006/02/09/debug_mod_perl.html.
Рэндал Л. Шварц пишет о профилировании в статье "Ускорение ваших программ Perl" для Unix Review http://www.stonehenge.com/merlyn/UnixReview/col49.html и "Профилирование в Template Toolkit через переопределение" для Linux Magazine http://www.stonehenge.com/merlyn/LinuxMag/col75.html.
Как ссылаться на мои программы Perl?
Модуль B::Xref можно использовать для создания отчётов по перекрёстным ссылкам для программ Perl.
perl -MO=Xref[,OPTIONS] scriptname.plx Есть ли красивенький форматировщик (форматер) для Perl?
Perl::Tidy поставляется с скриптом perl perltidy, который отступы и переформатирует скрипты Perl, чтобы сделать их более читаемыми, пытаясь следовать правилам из perlstyle. Если вы пишете на Perl или часто читаете код на Perl, это, вероятно, окажется полезным.
Конечно, если вы просто следуете рекомендациям в perlstyle, переформатирование не потребуется. Привычка форматировать код по мере написания поможет предотвратить ошибки. Ваш редактор может и должен помогать вам с этим. Режим perl или более новый режим cperl для emacs могут предоставить значительную помощь при работе с большинством (но не со всем) кодом, и даже менее программируемые редакторы могут оказать существенную поддержку. Том Кристиансен и многие другие пользователи VI клянутся следующими настройками в vi и его клонах:
set ai sw=4
map! ^O {^M}^[O^T Поместите это в ваш файл .exrc (заменив знаки возвратной каретки на управляющие символы) и всё готово. В режиме вставки ^T используется для отступа, ^D для отмены отступа, и ^O для отступа блока — как и следовало ожидать. Более полный пример с комментариями можно найти по адресу http://www.cpan.org/authors/id/T/TO/TOMC/scripts/toms.exrc.gz
Есть ли IDE или редактор Perl для Windows?
Программы Perl — это просто обычный текст, поэтому подойдёт любой редактор.
Если вы работаете в Unix, у вас уже есть IDE — это сам Unix. Философия Unix — это философия нескольких небольших инструментов, каждый из которых делает одно дело и делает его хорошо. Это как набор инструментов плотника.
Если вам нужна IDE, ознакомьтесь со следующим (в алфавитном порядке, а не по предпочтениям):
- Eclipse
-
Проект Eclipse Perl Integration Project интегрирует редактирование/отладку Perl с Eclipse.
- Enginsite
-
Редактор Perl от EngInSite — это полная интегрированная среда разработки (IDE) для создания, тестирования и отладки скриптов Perl; инструмент работает под Windows 9x/NT/2000/XP и новее.
- IntelliJ IDEA
-
https://plugins.jetbrains.com/plugin/7796
Плагин Camelcade предоставляет поддержку Perl5 в IntelliJ IDEA и других IDE JetBrains.
- Kephra
-
Графический редактор, написанный на Perl с использованием wxWidgets и Scintilla с множеством небольших функций. Цель — интерфейс пользователя, основанный на принципах Perl, таких как TIMTOWTDI и «лёгкие вещи должны быть лёгкими, сложные вещи должны быть возможными».
- Komodo
-
http://www.ActiveState.com/Products/Komodo/
Многоплатформенная (на октябрь 2004 года, это Windows, Linux и Solaris) многоязыковая IDE от ActiveState с поддержкой Perl, включая отладчик регулярных выражений и удалённую отладку.
- Notepad++
- Open Perl IDE
-
http://open-perl-ide.sourceforge.net/
Open Perl IDE — это интегрированная среда разработки для написания и отладки скриптов Perl с использованием дистрибутива ActivePerl от ActiveState под Windows 95/98/NT/2000.
- OptiPerl
-
OptiPerl — это IDE для Windows со смоделированной средой CGI, включая отладчик и редактор с подсветкой синтаксиса.
- Padre
-
Padre — многоплатформенная IDE для Perl, написанная на Perl с использованием wxWidgets для обеспечения родного внешнего вида. Она распространяется под открытой лицензией Artistic. Это одна из более новых IDE для Perl.
- PerlBuilder
-
http://www.solutionsoft.com/perl.htm
PerlBuilder — интегрированная среда разработки для Windows, поддерживающая разработку на Perl.
- visiPerl+
-
http://helpconsulting.net/visiperl/index.html
От Help Consulting, для Windows.
- Visual Perl
-
http://www.activestate.com/Products/Visual_Perl/
Visual Perl — это плагин для Visual Studio.NET от ActiveState.
- Zeus
-
http://www.zeusedit.com/lookmain.html
Zeus для Windows — ещё один Win32 многоязычный редактор/IDE, который поддерживает Perl.
Для редакторов: если вы работаете в Unix, у вас, вероятно, уже есть vi или его клон, а возможно и emacs, поэтому вам может не потребоваться ничего скачивать. В любом emacs режим cperl-mode (M-x cperl-mode) предоставляет, возможно, лучший режим редактирования Perl в любом редакторе.
Если вы используете Windows, вы можете использовать любой редактор, который позволяет работать с обычным текстом, например, Блокнот или WordPad. Текстовые процессоры, такие как Microsoft Word или WordPerfect, обычно не подходят, поскольку они вставляют всю информацию «за кулисами», хотя некоторые позволяют сохранять файлы как «Только текст». Вы также можете скачать текстовые редакторы, разработанные специально для программирования, такие как Textpad ( http://www.textpad.com/ ) и UltraEdit ( http://www.ultraedit.com/ ), среди прочих.
Если вы используете MacOS, то те же соображения применимы. MacPerl (для сред Classic) поставляется с простым редактором. Популярные внешние редакторы — BBEdit ( http://www.barebones.com/products/bbedit/ ) или Alpha ( http://www.his.com/~jguyer/Alpha/Alpha8.html ). Пользователи MacOS X также могут использовать редакторы Unix.
- GNU Emacs
- MicroEMACS
- XEmacs
- Jed
или ви-клон, такой как
Следующие — это Win32 многоязычные редакторы/IDE, которые поддерживают Perl:
- MultiEdit
- SlickEdit
- ConTEXT
Также существует текстовый редактор toyedit, написанный на Perl и поставляемый с модулем Tk на CPAN. ptkdb ( http://ptkdb.sourceforge.net/ ) — это отладчик на Perl/Tk, который выполняет роль среды разработки. Perl Composer ( http://perlcomposer.sourceforge.net/ ) — это среда разработки для создания графических интерфейсов пользователя на Perl/Tk.
В дополнение к редактору/среде разработки вы можете быть заинтересованы в более мощной оболочке для Win32. Варианты включают
- bash
-
из пакета Cygwin ( http://cygwin.com/ )
- zsh
Cygwin распространяется под лицензией GNU General Public License (но это не должно иметь значения для использования Perl). Cygwin содержит (кроме оболочки) полный набор стандартных утилит Unix toolkit.
- BBEdit и TextWrangler
-
являются текстовыми редакторами для OS X, имеющими режим Perl ( http://www.barebones.com/ ).
Где можно получить макросы Perl для vi?
Полную версию файла конфигурации vi Тома Кристиансена см. по адресу http://www.cpan.org/authors/id/T/TO/TOMC/scripts/toms.exrc.gz , стандартный эталонный файл для эмуляторов vi. Файл лучше всего работает с nvi, текущей версией vi из Беркли, которая, кстати, может быть скомпилирована с встроенным интерпретатором Perl — см. http://www.cpan.org/src/misc/ .
Где можно получить perl-mode или cperl-mode для emacs?
С версии Emacs 19, патчлевел 22, в нём есть как perl-mode.el, так и поддержка отладчика Perl. Они должны поставляться со стандартной дистрибуцией Emacs 19.
Обратите внимание, что perl-mode emacs может иметь проблемы с "main'foo" (одинарная кавычка) и нарушить отступы и подсветку. Вы, вероятно, используете "main::foo" в новом коде Perl, поэтому это не должно быть проблемой.
Для CPerlMode см. http://www.emacswiki.org/cgi-bin/wiki/CPerlMode
Как использовать curses с Perl?
Модуль Curses с CPAN предоставляет динамически загружаемый объектный модульный интерфейс к библиотеке curses. Небольшая демонстрация находится в каталоге http://www.cpan.org/authors/id/T/TO/TOMC/scripts/rep.gz ; эта программа повторяет команду и обновляет экран по мере необходимости, отображая rep ps axu аналогично top.
Как написать графический интерфейс (X, Tk, Gtk и т. д.) на Perl?
(внесён Бен Морроу)
Существует ряд модулей, которые позволяют вам создавать графические интерфейсы на Perl. Большинство наборов инструментов для графических интерфейсов имеют интерфейс Perl: ниже представлен неполный список.
- Tk
-
Он работает под Unix и Windows, и текущая версия выглядит не так плохо под Windows, как раньше. Некоторые элементы графического интерфейса всё ещё не совсем «правильные». Интерфейс очень естественный и «перловский», что делает его лёгким в использовании в небольших скриптах, которым нужен простой графический интерфейс. Он не обновлялся некоторое время.
- Wx
-
Это Perl-связка для кроссплатформенного набора инструментов wxWidgets ( http://www.wxwidgets.org ). Он работает под Unix, Win32 и Mac OS X, используя родные виджеты (Gtk под Unix). Интерфейс очень похож на C++-интерфейс, но документация немного скудная для тех, кто не знаком с библиотекой, в основном она просто направляет вас к C++-документации.
- Gtk и Gtk2
-
Это Perl-связки для набора инструментов Gtk ( http://www.gtk.org ). Интерфейс значительно изменился между версиями 1 и 2, поэтому для них есть отдельные Perl-модули. Он работает под Unix, Win32 и Mac OS X (в настоящее время он требует сервер X на Mac OS, но «родной» порт находится в разработке), и виджеты выглядят одинаково на каждой платформе: то есть они не совпадают с родными виджетами. Как и в случае с Wx, Perl-связки тесно следуют за C API, и для понимания документации необходимо обратиться к документации на C.
- Win32::GUI
-
Это предоставляет доступ к большинству виджетов графического интерфейса Win32 из Perl. Очевидно, он работает только под Win32 и использует родные виджеты. Perl-интерфейс не очень похож на C-интерфейс: он был сделан более «перловским», и документация довольно хорошая. Более сложные вещи могут потребовать знакомства с C Win32 API или ссылок на MSDN.
- CamelBones
-
CamelBones ( http://camelbones.sourceforge.net ) — это Perl-интерфейс к набору инструментов Cocoa графического интерфейса Mac OS X, и как таковой может быть использован для создания родных графических интерфейсов под Mac OS X. Он не находится на CPAN, так как требует фреймворков, которые CPAN.pm не знает, как устанавливать, но установка выполняется через стандартный установщик пакетов OSX. Perl API снова очень близок к ObjC API, которое он обёрт, и документация просто объясняет, как перевести одно в другое.
- Qt
-
Существует Perl-интерфейс к набору инструментов Qt компании TrollTech, но он, похоже, не поддерживается.
- Athena
-
Sx — это интерфейс к набору виджетов Athena, который поставляется с X, но опять же, похоже, он в настоящее время не очень используется.
Как сделать свою Perl-программу быстрее?
Лучший способ сделать это — разработать лучший алгоритм. Это часто может существенно повлиять на результат. В книге Джона Бентли «Programming Pearls» есть также несколько полезных советов по оптимизации. Советы по бенчмаркингу сводятся к следующему: проводить бенчмаркинг и профилирование, чтобы убедиться, что вы оптимизируете нужную часть, искать лучшие алгоритмы вместо микронастройки кода, и, если ничего не помогает, рассмотреть возможность покупки более быстрого оборудования. Вероятно, вам захочется прочитать ответ на более ранний вопрос «Как профилировать мои Perl-программы?», если вы этого ещё не сделали.
Другой подход — автоматическое подключать редко используемый Perl-код. См. модули AutoSplit и AutoLoader в стандартной дистрибуции для этого. Или вы можете найти узкое место и подумать о написании только этой части на C, как мы раньше находили узкие места в коде C и писали их на ассемблере. Аналогично переписыванию на C, модули, имеющие критические секции, могут быть написаны на C (например, модуль PDL с CPAN).
Если вы в настоящее время связываете свой исполняемый файл perl с динамической библиотекой libc.so, то вы часто можете получить выигрыш в производительности на 10-25%, перестроив его для связывания со статической библиотекой libc.a вместо неё. Это увеличит размер исполняемого файла perl, но ваши Perl-программы (и программисты) могут вам за это поблагодарить. Дополнительную информацию см. в файле INSTALL в исходном дистрибутиве.
Программа undump была древней попыткой ускорить Perl-программы путём сохранения уже скомпилированной формы на диске. Это больше не является жизнеспособным вариантом, так как она работала только на некоторых архитектурах и не была хорошим решением.
Как сделать, чтобы моя Perl-программа занимала меньше памяти?
В отношении компромисса время-память Perl почти всегда предпочитает использовать больше памяти. Скаляры в Perl используют больше памяти, чем строки в C, массивы занимают больше, а хэши ещё больше. Хотя здесь всё ещё многое предстоит сделать, в последних выпусках эти проблемы решались. Например, начиная с версии 5.004, дублированные ключи хэшей совместно используются всеми хэшами, которые их используют, поэтому не требуют перераспределения.
В некоторых случаях использование substr() или vec() для моделирования массивов может быть очень полезным. Например, массив из тысячи булевых значений займёт как минимум 20 000 байтов памяти, но его можно преобразовать в один 125-байтовый бит-вектор — значительная экономия памяти. Модуль Tie::SubstrHash из стандартной дистрибуции также может помочь для некоторых типов структур данных. Если вы работаете со специализированными структурами данных (матрицами, например), модули, реализующие их на C, могут занимать меньше памяти, чем эквивалентные Perl-модули.
Ещё можно попробовать узнать, был ли ваш Perl скомпилирован с системным malloc или с встроенным malloc Perl. Какой бы вариант ни был использован, попробуйте использовать другой и посмотрите, повлияет ли это на результат. Сведения о malloc содержатся в файле INSTALL в исходном дистрибутиве. Вы можете узнать, используете ли вы malloc perl, набрав perl -V:usemymalloc.
Конечно, лучший способ сэкономить память — вообще не тратить её. Хорошие программистские практики могут многое сделать для этого:
- Не используйте «slurp»!
-
Не читайте весь файл в память, если вы можете обрабатывать его построчно. Или, более конкретно, используйте цикл такого типа:
# # Good Idea # while (my $line = <$file_handle>) { # ... }вместо этого:
# # Bad Idea # my @data = <$file_handle>; foreach (@data) { # ... }Когда обрабатываемые файлы небольшие, это не так важно, но это сильно влияет, когда они начинают увеличиваться.
- Используйте map и grep избирательно
-
Помните, что как map, так и grep ожидают аргумент LIST, поэтому выполнение этого:
@wanted = grep {/pattern/} <$file_handle>;приведёт к тому, что весь файл будет загружен. Для больших файлов лучше использовать цикл:
while (<$file_handle>) { push(@wanted, $_) if /pattern/; } - Избегайте ненужных кавычек и строковой типизации
-
Не заключайте большие строки в кавычки, если это не абсолютно необходимо:
my $copy = "$large_string";создаёт 2 копии $large_string (одна для $copy и другая для кавычек), тогда как
my $copy = $large_string;создаёт только одну копию.
То же самое касается строковой типизации больших массивов:
{ local $, = "\n"; print @big_array; }гораздо эффективнее, чем любой из
print join "\n", @big_array;или
{ local $" = "\n"; print "@big_array"; } - Передача по ссылке
-
Передавайте массивы и хэши по ссылке, а не по значению. Во-первых, это единственный способ передать несколько списков или хэшей (или и то, и другое) в одном вызове/возврате. Это также предотвращает создание копии всего содержимого. Однако это требует некоторой оценки, поскольку любые изменения будут переданы обратно исходным данным. Если вы действительно хотите изменить копию, вам придётся пожертвовать памятью, необходимой для её создания.
- Связать большие переменные с диском
-
Для «больших» хранилищ данных (то есть таких, которые превышают доступную память), рассмотрите возможность использования одного из DB-модулей для хранения их на диске вместо оперативной памяти. Это приведёт к штрафу во времени доступа, но это, вероятно, лучше, чем вызвать избыточную работу жесткого диска из-за массового обмена.
Безопасно ли возвращать ссылку на локальные или лексические данные?
Да. Система сборки мусора 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 ОС, а не malloc Perl.
В целом, выделение и освобождение памяти — это не то, о чём вам нужно или следует много беспокоиться в Perl.
См. также «Как сделать программу Perl менее ресурсоёмкой?»
Как сделать свой скрипт CGI более эффективным?
Помимо обычных мер, описанных для ускорения или уменьшения размера общих программ Perl, у программ CGI есть дополнительные проблемы. Они могут выполняться несколько раз в секунду. Учитывая, что каждый раз при запуске скрипт будет нуждаться в новой компиляции и часто выделять мегабайт или более системной памяти, это может стать серьёзной проблемой. Компиляция в C вам не поможет, так как узким местом является накладные расходы на запуск процесса.
Существует три популярных способа избежать этих накладных расходов. Одно решение заключается в запуске сервера Apache HTTP (доступен на http://www.apache.org/ ) с модулями плагинов mod_perl или mod_fastcgi.
С помощью mod_perl и модуля Apache::Registry (распространяемого с mod_perl), httpd будет работать с встроенным интерпретатором Perl, который предварительно скомпилирует ваш скрипт, а затем выполнит его в том же адресном пространстве без разветвления. Расширение Apache также предоставляет Perl доступ к внутреннему API сервера, поэтому модули, написанные на Perl, могут делать практически всё, что может модуль, написанный на C. Для получения дополнительной информации о mod_perl см. http://perl.apache.org/
С помощью модуля FCGI (из CPAN) и модуля mod_fastcgi (доступен на http://www.fastcgi.com/ ), каждая из ваших Perl-программ становится постоянным процессом демона CGI.
Наконец, Plack — это Perl-модуль и набор инструментов, содержащий PSGI-среду, помощники и адаптеры для веб-серверов, что позволяет легко развертывать скрипты, которые могут продолжать работу, и обеспечивает гибкость в отношении используемого веб-сервера. Он может позволить существующим скриптам CGI воспользоваться этой гибкостью и производительностью с минимальными изменениями или может быть использован вместе с современными Perl-фреймворками для веб-служб, чтобы упростить написание и развертывание веб-сервисов с помощью Perl.
Эти решения могут иметь далеко идущие последствия для вашей системы и для способа написания ваших программ CGI, поэтому тщательно изучите их.
См. также http://www.cpan.org/modules/by-category/15_World_Wide_Web_HTML_HTTP_CGI/ .
Как скрыть исходный код моей Perl-программы?
Удалите его. :-) Серьёзно, существует ряд (в основном неудовлетворительных) решений с различными уровнями «безопасности».
Однако, прежде всего, вы не можете убрать разрешение на чтение, потому что исходный код должен быть читаемым, чтобы его можно было скомпилировать и интерпретировать. (Это не означает, что исходный код скрипта CGI доступен для людей в Интернете, однако — только для людей с доступом к файловой системе.) Поэтому вам нужно оставить разрешения на дружелюбном уровне 0755.
Некоторые люди рассматривают это как проблему безопасности. Если ваша программа делает небезопасные вещи и полагается на то, что люди не знают, как эксплуатировать эти уязвимости, она не является безопасной. Нередко можно определить небезопасные действия и использовать их без просмотра исходного кода. Безопасность через невидимость, то есть скрытие ваших ошибок вместо их исправления, — это не лучшая защита.
Вы можете попробовать использовать шифрование через фильтры исходного кода (начиная с Perl 5.8, модули Filter::Simple и Filter::Util::Call включены в стандартное распространение), но любой достойный программист сможет его расшифровать. Вы можете попробовать использовать компилятор и интерпретатор байт-кода, описанные позже в perlfaq3, но любопытные всё ещё смогут его декомпилировать. Вы можете попробовать использовать компилятор нативного кода, описанный позже, но взломщики могут его дизассемблировать. Эти методы создают различную сложность для тех, кто хочет получить доступ к вашему коду, но ни один из них не может окончательно его скрыть (это относится ко всем языкам, а не только к Perl).
Очень легко восстановить исходный код Perl-программ. Просто передайте программу интерпретатору Perl и используйте модули в иерархии B::. Модуль B::Deparse должен иметь возможность победить большинство попыток скрыть исходный код. Опять же, это не уникально для Perl.
Если вас беспокоит получение прибыли от вашего кода, то единственное, что может гарантировать юридическую безопасность, это ограниченное лицензирование. Лицензируйте своё программное обеспечение и добавьте угрожающие заявления, такие как «Это не опубликованное конфиденциальное программное обеспечение XYZ Corp. Ваш доступ к нему не дает вам разрешения использовать его blah blah blah». Конечно, мы не юристы, поэтому вам следует обратиться к юристу, если вы хотите быть уверены, что формулировка вашей лицензии выдержит испытание в суде.
Как скомпилировать мою Perl-программу в байт-код или C?
(внесён вклад brian d foy)
В общем случае это невозможно. Однако есть некоторые вещи, которые могут сработать в вашей ситуации. Люди обычно задают этот вопрос, потому что хотят распространять свои произведения, не разглашая исходный код, и большинство решений обменивают дисковое пространство на удобство. Скорее всего, вы также не увидите значительного увеличения скорости, так как большинство решений просто объединяют интерпретатор Perl в конечный продукт (но см. "Как ускорить мою Perl-программу?").
Perl Archive Toolkit — аналог Java JAR для Perl. Он свободно доступен и находится в CPAN ( https://metacpan.org/pod/PAR ).
Также существуют некоторые коммерческие продукты, которые могут вам подойти, хотя за них придётся заплатить.
Perl Dev Kit ( http://www.activestate.com/Products/Perl_Dev_Kit/ ) от ActiveState может «преобразовать ваши Perl-программы в готовые к работе исполняемые файлы для HP-UX, Linux, Solaris и Windows».
Perl2Exe ( http://www.indigostar.com/perl2exe.htm ) — это командная программа для преобразования Perl-скриптов в исполняемые файлы. Она поддерживает как Windows, так и Unix-платформы.
Как заставить #!perl работать на [MS-DOS,NT,...]?
Для OS/2 просто используйте
extproc perl -S -your_switches в качестве первой строки в файле *.cmd (-S из-за ошибки в обработке "extproc" в cmd.exe). Для DOS сначала необходимо создать соответствующий пакетный файл и закодировать его в ALTERNATE_SHEBANG (см. файл dosish.h в исходном распределении для получения дополнительной информации).
Установка Win95/NT при использовании порта Perl от ActiveState изменит реестр, чтобы ассоциировать расширение .pl с интерпретатором Perl. Если вы установите другой порт, возможно, даже создадите свой собственный Perl Win95/NT из стандартных источников, используя Windows-порт gcc (например, с помощью cygwin или mingw32), то вам придётся изменить реестр самостоятельно. В дополнение к ассоциации .pl с интерпретатором пользователи NT могут использовать: SET PATHEXT=%PATHEXT%;.PL чтобы запустить программу install-linux.pl просто набрав install-linux.
В «классической» MacOS Perl-программа будет иметь соответствующие значения Creator и Type, поэтому двойной щелчок по ним запустит приложение MacPerl. В Mac OS X приложения с возможностью запуска по двойному щелчку могут быть созданы из любого скрипта #! с помощью утилиты DropScript от Wil Sanchez: http://www.wsanchez.net/software/ .
ВАЖНО!: Что бы вы ни делали, ПОЖАЛУЙСТА, не теряйте терпение и не размещайте интерпретатор Perl в директории cgi-bin, чтобы ваши программы работали с веб-сервером. Это крайне серьёзная проблема безопасности. Уделите время, чтобы понять, как это сделать правильно.
Могу ли я написать полезные Perl-программы в командной строке?
Да. Подробнее см. perlrun. Далее приведены некоторые примеры. (Эти примеры предполагают стандартные правила цитирования Unix-оболочки.)
# sum first and last fields
perl -lane 'print $F[0] + $F[-1]' *
# identify text files
perl -le 'for(@ARGV) {print if -f && -T _}' *
# remove (most) comments from C program
perl -0777 -pe 's{/\*.*?\*/}{}gs' foo.c
# make file a month younger than today, defeating reaper daemons
perl -e '$X=24*60*60; utime(time(),time() + 30 * $X,@ARGV)' *
# find first unused uid
perl -le '$i++ while getpwuid($i); print $i'
# display reasonable manpath
echo $PATH | perl -nl -072 -e '
s![^/+]*$!man!&&-d&&!$s{$_}++&&push@m,$_;END{print"@m"}' Хорошо, последний пример был на самом деле заданием конкурса Obfuscated Perl Contest. :-)
Почему Perl-однострочники не работают на моей системе DOS/Mac/VMS?
Проблема обычно заключается в том, что интерпретаторы командных строк на этих системах имеют совершенно другие представления о цитировании, чем Unix-оболочки, в которых были созданы однострочники. На некоторых системах может потребоваться изменить одинарные кавычки на двойные, чего не следует делать на Unix- или Plan9-системах. Возможно, также потребуется изменить одну % на две %%.
Например:
# Unix (including Mac OS X)
perl -e 'print "Hello world\n"'
# DOS, etc.
perl -e "print \"Hello world\n\""
# Mac Classic
print "Hello world\n"
(then Run "Myscript" or 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. Для учебников см. две книги, посвящённые веб-программированию в вопросе о книгах. Для проблем и вопросов, связанных с веб-программированием, таких как «Почему я получаю 500 ошибок» или «Почему он не запускается из браузера, когда работает нормально в командной строке», см. руководства по устранению неполадок и справку в perlfaq9 или в CGI MetaFAQ:
L<http://www.perl.org/CGI_MetaFAQ.html> Однако, настоятельно рекомендуется изучить https://plackperl.org и современные Perl-фреймворки для веб-программирования; веб-программирование на Perl эволюционировало далеко от старых простых CGI-скриптов.
Где я могу узнать об объектно-ориентированном программировании на Perl?
Хорошим началом будет perlootut, а для справок вы можете использовать perlobj.
Хорошей книгой по ОО на Perl является «Объектно-ориентированный Perl» Дэмиана Конвея от Manning Publications или «Промежуточный Perl» Рэндала Шварца, Брайана Фоя и Тома Феникса от O'Reilly Media.
Где я могу узнать о связывании C с Perl?
Если вы хотите вызывать C из Perl, начните с perlxstut, переходя к perlxs, xsubpp и perlguts. Если вы хотите вызывать Perl из C, прочитайте perlembed, perlcall и perlguts. Не забывайте, что вы можете многому научиться, изучая, как авторы существующих модулей расширения писали свой код и решали свои проблемы.
Возможно, вам не понадобится вся мощь XS. Модуль Inline::C позволяет поместить код C непосредственно в ваш Perl-скрипт. Он обрабатывает всю магию, чтобы это работало. Вам все равно нужно изучить хотя бы часть API Perl, но вам не придется иметь дело со сложностью файлов поддержки XS.
Я прочитал perlembed, perlguts и т. д., но не могу встроить Perl в мою программу на C; что я делаю неправильно?
Загрузите пакет ExtUtils::Embed с CPAN и выполните `make test'. Если тесты пройдены, перечитайте подс ещё и ещё раз. Если они не пройдены, отправьте отчет об ошибке на https://github.com/Perl/perl5/issues с выводом 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?
(внесено brian d foy)
Модуль ExtUtils::MakeMaker, более известный просто как "MakeMaker", преобразует Perl-скрипт, обычно называемый Makefile.PL, в Makefile. Утилита Unix make использует этот файл для управления зависимостями и действиями по обработке и установке дистрибутива Perl.
АВТОР И АВТОРСКИЕ ПРАВА
Авторские права (c) 1997-2010 Tom Christiansen, Nathan Torkington и другие авторы, как указано. Все права защищены.
Данная документация бесплатна; вы можете перераспределять ее и/или изменять ее на тех же условиях, что и сам Perl.
Независимо от его распространения, все примеры кода здесь находятся в общественном достоянии. Вам разрешается и поощряется использование этого кода и любых производных от него в ваших собственных программах для развлечения или получения прибыли, как вам заблагорассудится. Простой комментарий в коде, дающий заслугу FAQ, был бы вежливым, но не обязательным.
© 1993–2021 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.34.0/perlfaq3