perlfaq3
СОДЕРЖАНИЕ
- НАЗВАНИЕ
- ВЕРСИЯ
- ОПИСАНИЕ
- Как сделать (что угодно)?
- Как использовать Perl интерактивно?
- Как найти установленные модули на моей системе?
- Как отладить мои программы Perl?
- Как проанализировать производительность моих программ Perl?
- Как выполнить перекрестную ссылку в моих программах Perl?
- Существует ли форматировщик кода (pretty-printer) для 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.20210520
ОПИСАНИЕ
Этот раздел 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 для измерения и сравнения фрагментов кода.
Подробнее о профилировании можно прочитать в книге Programming Perl, глава 20, или в книге Mastering Perl, глава 5.
perldebguts описывает создание пользовательского отладчика, если вам нужно создать специальный профилировщик. brian d foy описывает процесс в The Perl Journal, "Создание Perl отладчика", http://www.ddj.com/184404522, и "Профилирование в Perl" http://www.ddj.com/184404580.
На Perl.com есть две интересные статьи о профилировании: "Профилирование Perl", Simon Cozens, https://www.perl.com/pub/2004/06/25/profiling.html/ и "Отладка и профилирование приложений mod_perl", Frank Wiles, http://www.perl.com/pub/a/2006/02/09/debug_mod_perl.html.
Randal L. Schwartz пишет о профилировании в "Ускорение ваших программ 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 могут предоставить значительную помощь с большинством (но не со всем) кодом, и даже менее программируемые редакторы могут оказать значительную помощь. Tom Christiansen и многие другие пользователи 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 — это Windows IDE со смоделированной средой 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 (для классических сред) поставляется с простым редактором. Популярные внешние редакторы — 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 Text widget, написанный на Perl, который распространяется с модулем Tk на CPAN. ptkdb ( http://ptkdb.sourceforge.net/ ) — это отладчик Perl/Tk, который действует как своего рода среда разработки. Perl Composer ( http://perlcomposer.sourceforge.net/ ) — это IDE для создания GUI на Perl/Tk.
END_OF_DOCUMENT_MARKERПомимо редактора/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 patchlevel 22 и далее, есть как perl-mode.el, так и поддержка Perl отладчика, встроенного в Emacs. Они должны входить в стандартную дистрибуцию 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, как раньше. Некоторые элементы графического интерфейса по-прежнему не совсем «чувствуются» правильно. Интерфейс очень естественный и «perl-подобный», что облегчает использование в небольших скриптах, которым нужен простой графический интерфейс. Он не обновлялся довольно долго.
- 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-интерфейсом: он был сделан более «perl-подобным», и документация довольно хорошая. Более сложные вещи могут потребовать знакомства с 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.
Конечно, лучший способ сохранить память — не делать ничего, что её тратит. Хорошие программистские практики могут многое дать в этом направлении:
- Не считывайте всё!
-
Не считывайте весь файл в память, если вы можете обрабатывать его по строкам. Или, более конкретно, используйте цикл:
# # 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 ОС, а не 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. Ваш доступ к нему не дает вам разрешения на его использование бла-бла-бла». Конечно, мы не юристы, поэтому вам следует обратиться к юристу, если вы хотите быть уверенным, что формулировка вашей лицензии устоит в суде.
Как скомпилировать свою программу 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 будет иметь соответствующие создатель и тип, чтобы двойной щелчок по ней вызывал приложение MacPerl. В Mac OS X приложения с возможностью запуска можно создать из любого скрипта #! с помощью утилиты Wil Sanchez' DropScript: http://www.wsanchez.net/software/ .
ВАЖНО!: Что бы вы ни делали, ПОЖАЛУЙСТА, не расстраивайтесь и не бросайте интерпретатор Perl в каталог cgi-bin, чтобы ваши программы работали с веб-сервером. Это EXTREMELY большая угроза безопасности. Выделите время, чтобы разобраться, как это сделать правильно.
Можно ли написать полезные программы 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() вместо «двойных кавычек», 'одинарных кавычек' и `обратных кавычек` может упростить написание однострочных программ.
Нет общего решения для всего этого. Это беспорядок.
[Часть этого ответа была предоставлена Kenneth Albanowski.]
Где можно узнать о CGI или веб-программировании на Perl?
Для модулей получите модули CGI или LWP из CPAN. Для учебников см. две книги, специально посвященные веб-программированию в разделе вопросов о книгах. Для проблем и вопросов, связанных с веб-программированием, например, «Почему я получаю 500 ошибок» или «Почему он не работает из браузера, когда работает в командной строке», см. руководства по устранению неполадок и ссылки в perlfaq9 или в мета-FAQ 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» Рэнди Шварца, brian d foy и Тома Феникса от 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'. Если тесты пройдут, прочитайте pods снова и снова. Если они не пройдут, отправьте отчёт об ошибке на 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.36.0/perlfaq3