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.20200523
ОПИСАНИЕ
Этот раздел 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 для создания файла автосвязки, который 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 (Если вы не получите ошибку "Не удаётся найти ... в @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 описывает этот процесс в статьях «Создание отладчика Perl» в «The Perl Journal», 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 License. Это одна из новейших 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 — ещё один редактор/IDE Win32 для нескольких языков с поддержкой Perl.
Для редакторов: если вы работаете под Unix, у вас, вероятно, уже есть vi или его клон, и, возможно, также emacs, поэтому вам, возможно, ничего не придётся скачивать. В любом emacs режим cperl-mode (M-x cperl-mode) предоставляет, возможно, лучший доступный режим редактирования Perl в любом редакторе.
Если вы используете Windows, вы можете использовать любой редактор, позволяющий работать с обычным текстом, например, NotePad или 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
или ви-клон, такой как
Ниже перечислены редакторы/IDE Win32 для нескольких языков, которые поддерживают Perl:
- MultiEdit
- SlickEdit
- ConTEXT
Также существует текстовый редактор toyedit Text widget, написанный на Perl и распространяемый с модулем Tk на CPAN. ptkdb ( http://ptkdb.sourceforge.net/ ) — это отладчик на основе Perl/Tk, который выполняет роль среды разработки. Perl Composer ( http://perlcomposer.sourceforge.net/ ) — это IDE для создания графических интерфейсов пользователя на Perl/Tk.
Помимо редактора/IDE, вас может заинтересовать более мощная оболочка для 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. Большинство наборов инструментов GUI имеют Perl-интерфейс: следует список, неполный.
- Tk
-
Он работает под Unix и Windows, и текущая версия выглядит не так плохо под Windows, как раньше. Некоторые элементы GUI по-прежнему не ощущаются так же, как нужно. Интерфейс очень естественный и «перловский», что делает его удобным для использования в небольших скриптах, которые просто нуждаются в простом GUI. Он долгое время не обновлялся.
- 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 (в настоящее время для Mac OS требуется сервер X, но «родной» порт находится в разработке), и виджеты выглядят одинаково на каждой платформе: то есть они не соответствуют родным виджетам. Как и в случае с Wx, Perl-связывания тесно следуют за C-API, а документация требует ознакомления с C-документацией, чтобы понять её.
- Win32::GUI
-
Это предоставляет доступ к большинству виджетов Win32 GUI из Perl. Очевидно, он работает только под Win32 и использует родные виджеты. Perl-интерфейс не совсем следует за C-интерфейсом: он был сделан более «перловским», и документация довольно хороша. Более сложные вещи могут потребовать знакомства с C Win32 API или ссылаться на MSDN.
- CamelBones
-
CamelBones ( http://camelbones.sourceforge.net ) — это Perl-интерфейс к Cocoa GUI-набору инструментов Mac OS X, и благодаря этому он может использоваться для создания родных GUI на 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 из стандартных источников с помощью порта gcc для Windows (например, с cygwin или mingw32), то вам придётся самостоятельно изменить реестр. В дополнение к ассоциации .pl с интерпретатором, пользователи NT могут использовать: SET PATHEXT=%PATHEXT%;.PL чтобы запустить программу install-linux.pl просто набрав install-linux.
В «классическом» MacOS программа Perl будет иметь соответствующие Creator и Type, так что двойной щелчок по ним запустит приложение MacPerl. В Mac OS X приложения, на которые можно нажимать, можно создать из любого скрипта #! с помощью утилиты Wil Sanchez' DropScript: 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:
L<http://www.perl.org/CGI_MetaFAQ.html> Однако настоятельно рекомендуется изучить https://plackperl.org и современные фреймворки веб-программирования на Perl; веб-программирование на Perl значительно эволюционировало со времён простых скриптов CGI.
Где можно узнать об объектно-ориентированном программировании на Perl?
Хорошим началом является perlootut, а для справки можно использовать perlobj.
Хорошей книгой по ОО на Perl является «Object-Oriented Perl» Дамиана Конвея издательства Manning Publications или «Intermediate Perl» Рэнди Шварца, Брайана д Фоя и Тома Феникса издательства O'Reilly Media.
Где можно узнать о связывании C с Perl?
Если вы хотите вызывать C из Perl, начните с perlxstut, а затем перейдите к perlxs, xsubpp и perlguts. Если вы хотите вызывать Perl из C, прочитайте perlembed, perlcall и perlguts. Не забывайте, что вы можете многое узнать, изучая, как авторы существующих модулей расширений написали свой код и решили свои проблемы.
END_OF_DOCUMENT_MARKERВозможно, вам не понадобится вся мощь XS. Модуль Inline::C позволяет поместить код на C непосредственно в ваш Perl-скрипт. Он обрабатывает всю магию, чтобы это работало. Вам всё равно нужно изучить хотя бы часть API Perl, но вам не придётся иметь дело со сложностью файлов поддержки XS.
Я прочитал perlembed, perlguts и т. д., но не могу встроить Perl в свою программу на C; что я делаю неправильно?
Загрузите пакет ExtUtils::Embed с CPAN и выполните `make test'. Если тесты пройдены, перечитайте POD снова и снова. Если тесты не пройдены, отправьте отчёт об ошибке на 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–2020 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.32.0/perlfaq3