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.20190126
ОПИСАНИЕ
Этот раздел 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», «Creating a Perl Debugger», http://www.ddj.com/184404522, и «Profiling in Perl» http://www.ddj.com/184404580.
На Perl.com есть две интересные статьи о профилировании: «Profiling Perl» Саймона Козенса, http://www.perl.com/lpt/a/850 и «Debugging and Profiling mod_perl Applications» Франка Уайлса, http://www.perl.com/pub/a/2006/02/09/debug_mod_perl.html.
Рэндол Л. Шварц пишет о профилировании в «Speeding up Your Perl Programs» для «Unix Review», http://www.stonehenge.com/merlyn/UnixReview/col49.html, и «Profiling in Template Toolkit via Overriding» для «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/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, вы можете использовать любой редактор, который позволяет работать с обычным текстом, например, Блокнот или 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
или ви-клоны, такие как
Следующие — это редакторы/IDE Win32 для нескольких языков, которые поддерживают Perl:
- MultiEdit
- SlickEdit
- ConTEXT
Также существует редактор с виджетом toyedit, написанный на Perl и распространяемый с модулем Tk на CPAN. ptkdb ( http://ptkdb.sourceforge.net/ ) — это отладчик Perl/Tk, который действует как своего рода среда разработки. Perl Composer ( http://perlcomposer.sourceforge.net/ ) — IDE для создания графического интерфейса пользователя на Perl/Tk.
END_OF_DOCUMENT_MARKERПомимо редактора/IDE, вас может заинтересовать более мощная оболочка для Win32. Ваши варианты включают
- bash
-
из пакета Cygwin ( http://cygwin.com/ )
- zsh
Cygwin распространяется по лицензии GNU General Public License (но это не должно иметь значения для использования Perl). Cygwin содержит (кроме оболочки) полный набор стандартных утилит инструментария Unix.
- BBEdit и TextWrangler
-
являются текстовыми редакторами для OS X, которые имеют режим чувствительности к Perl ( http://www.barebones.com/ ).
Где можно получить макросы Perl для vi?
Для полной версии файла конфигурации vi Тома Кристиансена см. http://www.cpan.org/authors/Tom_Christiansen/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/Tom_Christiansen/scripts/rep.gz ; эта программа повторяет команду и обновляет экран по мере необходимости, отображая rep ps axu аналогично top.
Как создать графический интерфейс пользователя (X, Tk, Gtk и т. д.) на Perl?
(внесен Бен Морроу)
Существует ряд модулей, позволяющих создавать графические интерфейсы пользователя на Perl. Большинство наборов инструментов графического интерфейса пользователя имеют 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 (в настоящее время он требует сервер X на Mac OS, но «родная» версия находится в разработке), и виджеты выглядят одинаково на всех платформах: т.е. они не соответствуют родным виджетам. Как и в случае с Wx, Perl-связывания тесно следуют за C-API, а документация требует ознакомления с C-документацией для ее понимания.
- Win32::GUI
-
Это обеспечивает доступ к большинству виджетов Win32 GUI из Perl. Очевидно, он работает только под Win32 и использует родные виджеты. Perl-интерфейс не совсем следует за C-интерфейсом: он был сделан более Perl-образным, а документация довольно хорошая. Более сложные вещи могут потребовать знакомства с C-API Win32 или ссылок на MSDN.
- CamelBones
-
CamelBones ( http://camelbones.sourceforge.net ) — это Perl-интерфейс к набору инструментов графического интерфейса Cocoa Mac OS X, и благодаря этому может использоваться для создания собственных графических интерфейсов пользователя на Mac OS X. Он не находится в CPAN, так как требует фреймворков, которые CPAN.pm не знает, как установить, но установка выполняется через стандартный установщик пакетов OSX. Perl-API, опять же, очень близок к API ObjC, который он оборачивает, а документация просто говорит вам, как перевести один в другой.
- 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"; } - Передача по ссылке
-
Передавайте массивы и хэши по ссылке, а не по значению. Во-первых, это единственный способ передать несколько списков или хэшей (или оба) в одном вызове/возвращении. Это также позволяет избежать создания копии всего содержимого. Однако это требует некоторого суждения, поскольку любые изменения будут переданы обратно исходным данным. Если вы действительно хотите изменить копию, вам придется пожертвовать памятью, необходимой для ее создания.
- Связывание больших переменных с диском
-
Для «больших» хранилищ данных (т.е. таких, которые превышают доступную оперативную память) подумайте об использовании одного из модулей базы данных для хранения их на диске вместо оперативной памяти. Это приведет к снижению скорости доступа, но это, вероятно, лучше, чем привести к фрагментации жесткого диска из-за интенсивного использования подкачки.
Безопасно ли возвращать ссылку на локальные или лексические данные?
Да. Система сбора мусора Perl позаботится об этом, поэтому все будет работать правильно.
sub makeone {
my @a = ( 1 .. 10 );
return \@a;
}
for ( 1 .. 10 ) {
push @many, makeone();
}
print $many[4][5], "\n";
print "@many\n"; Как освободить массив или хэш, чтобы моя программа уменьшилась?
(внесен Майклом Карманом)
Обычно это невозможно. Память, выделенная лексическим переменным (т.е. переменным my()), не может быть возвращена или повторно использована, даже если они выходят из области видимости. Она резервируется на случай, если переменные снова войдут в область видимости. Память, выделенная глобальным переменным, может быть повторно использована (в пределах вашей программы) с помощью undef() и/или delete().
На большинстве операционных систем память, выделенная программе, никогда не может быть возвращена системе. Вот почему долго работающие программы иногда перезапускают себя. Некоторые операционные системы (в частности, системы, которые используют mmap(2) для выделения больших блоков памяти) могут освобождать память, которая больше не используется, но в таких системах Perl необходимо настроить и скомпилировать так, чтобы он использовал malloc ОС, а не свой собственный.
В общем, выделение и освобождение памяти — это не то, о чем вам нужно или следует много беспокоиться в Perl.
См. также «Как сделать мою программу Perl менее ресурсоемкой?»
Как сделать свой скрипт CGI более эффективным?
Помимо обычных мер, описанных для ускорения или уменьшения размера общих программ Perl, у программы CGI есть дополнительные проблемы. Она может запускаться несколько раз в секунду. Учитывая, что каждый раз при запуске она должна быть перекомпилирована и часто выделяет мегабайт или более системной памяти, это может быть критичным. Компиляция в C не поможет вам, потому что узким местом является начальная накладная стоимость процесса.
Существует три популярных способа избежать этой накладной стоимости. Одно решение заключается в запуске сервера 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. Если вы установите другой порт, возможно, даже создадите свой собственный Win95/NT Perl из стандартных источников с помощью порта 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, чтобы ваши программы работали с веб-сервером. Это ОЧЕНЬ большая угроза безопасности. Уделите время, чтобы разобраться, как это сделать правильно.
Можно ли писать полезные 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. :-)
Почему однострочные 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 или в CGI MetaFAQ:
L<http://www.perl.org/CGI_MetaFAQ.html> Однако рекомендуется изучить Plack и современные Perl-веб-фреймворки; веб-программирование на Perl сильно продвинулось с тех пор, как появились простые скрипты CGI.
Где можно узнать о объектно-ориентированном программировании на Perl?
Хорошим местом для начала является perlootut, а для справочной информации можно использовать perlobj.
Хорошей книгой об ООП на Perl является «Object-Oriented Perl» от Damian Conway из Manning Publications или «Intermediate Perl» от Randal Schwartz, brian d foy и Tom Phoenix из 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'. Если тесты пройдут, перечитайте POD снова и снова. Если они не пройдут, обратитесь к perlbug и отправьте отчет об ошибке с выводом make test TEST_VERBOSE=1 вместе с perl -V.
При попытке запустить скрипт я получил это сообщение. Что оно означает?
Полный список сообщений об ошибках и предупреждений Perl с пояснительным текстом можно найти в perldiag. Вы также можете использовать программу splain (входящую в состав Perl) для объяснения сообщений об ошибках:
perl program 2>diag.out
splain [-v] [-p] diag.out или измените свою программу, чтобы она объясняла сообщения за вас:
use diagnostics; или
use diagnostics -verbose; Что такое MakeMaker?
(внесен brian d foy)
Модуль ExtUtils::MakeMaker, более известный просто как "MakeMaker", преобразует скрипт Perl, обычно называемый Makefile.PL, в Makefile. Инструмент Unix make использует этот файл для управления зависимостями и действиями по обработке и установке дистрибутива Perl.
АВТОР И АВТОРСКИЕ ПРАВА
Copyright (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.30.3/perlfaq3