Spec-Zone.ru › Perl 5.28

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.021011

ОПИСАНИЕ

Этот раздел 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

(Если вы не получите сообщение об ошибке "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, http://www.perl.com/lpt/a/850 и "Отладка и профилирование приложений 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/TOMC/scripts/toms.exrc.gz

Есть ли IDE или редактор Perl для Windows?

Программы Perl — это просто обычный текст, поэтому подойдет любой редактор.

Если вы работаете в Unix, у вас уже есть IDE — сам Unix. Философия Unix — это философия нескольких небольших инструментов, каждый из которых делает одну вещь и делает её хорошо. Это как набор инструментов столяра.

Если вам нужна IDE, проверьте следующее (в алфавитном порядке, а не порядке предпочтения):

Eclipse

http://e-p-i-c.sf.net/

Проект Eclipse Perl Integration Project интегрирует редактирование/отладку Perl с Eclipse.

Enginsite

http://www.enginsite.com/

Редактор Perl от EngInSite — это полная интегрированная среда разработки (IDE) для создания, тестирования и отладки скриптов Perl; инструмент работает на Windows 9x/NT/2000/XP или более поздних версиях.

IntelliJ IDEA

https://plugins.jetbrains.com/plugin/7796

Плагин Camelcade предоставляет поддержку Perl5 в IntelliJ IDEA и других IDE JetBrains.

Kephra

http://kephra.sf.net

Графический редактор, написанный на Perl с использованием wxWidgets и Scintilla, с множеством небольших функций. Целится на пользовательский интерфейс, основанный на принципах Perl, таких как TIMTOWTDI и "лёгкие вещи должны быть лёгкими, сложные вещи должны быть возможны".

Komodo

http://www.ActiveState.com/Products/Komodo/

Многоплатформенная (по состоянию на октябрь 2004 года, это Windows, Linux и Solaris) многоязыковая IDE от ActiveState имеет поддержку Perl, включая отладчик регулярных выражений и удалённую отладку.

Notepad++

http://notepad-plus.sourceforge.net/

Open Perl IDE

http://open-perl-ide.sourceforge.net/

Open Perl IDE — это интегрированная среда разработки для написания и отладки скриптов Perl с дистрибутивом ActivePerl от ActiveState под Windows 95/98/NT/2000.

OptiPerl

http://www.optiperl.com/

OptiPerl — это Windows IDE с эмулированной средой CGI, включая отладчик и редактор с подсветкой синтаксиса.

Padre

http://padre.perlide.org/

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

http://www.gnu.org/software/emacs/windows/ntemacs.html

MicroEMACS

http://www.microemacs.de/

XEmacs

http://www.xemacs.org/Download/index.html

Jed

http://space.mit.edu/~davis/jed/

или клон vi, такой как

Vim

http://www.vim.org/

Vile

http://dickey.his.com/vile/vile.html

Ниже приведены многоязычные редакторы/IDE Win32, которые поддерживают Perl:

MultiEdit

http://www.MultiEdit.com/

SlickEdit

http://www.slickedit.com/

ConTEXT

http://www.contexteditor.org/

Также существует редактор toyedit Text widget, написанный на 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

http://www.zsh.org/

Cygwin лицензируется по GNU General Public License (но это не должно иметь значения для использования Perl). Cygwin содержит (кроме оболочки) комплексный набор стандартных утилит Unix toolkit.

BBEdit и TextWrangler

являются текстовыми редакторами для OS X, которые имеют режим Perl sensitivity ( 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 из Perl. Очевидно, он работает только под Win32 и использует родные виджеты. Perl-интерфейс фактически не следует C-интерфейсу: он был сделан более 'perl-образным', а документация довольно хороша. Более продвинутые вещи могут потребовать знакомства с C Win32 API или ссылки на MSDN.

CamelBones

CamelBones ( http://camelbones.sourceforge.net ) — это Perl-интерфейс к набору инструментов графического интерфейса Cocoa Mac OS X, и как таковой может быть использован для создания собственных графических интерфейсов на Mac OS X. Он не находится в CPAN, поскольку требует фреймворков, которые CPAN.pm не знает как установить, но установка происходит через стандартный установщик пакетов OSX. Perl API, опять же, очень близок к ObjC API, которое он оборачивает, и документация просто показывает, как перевести один в другой.

Qt

Существует Perl-интерфейс к набору инструментов Qt TrollTech, но он, кажется, не поддерживается.

Athena

Sx — это интерфейс к набору виджетов Athena, который поставляется с X, но, опять же, он, похоже, не используется в наши дни.

Как ускорить свою программу Perl?

Лучший способ сделать это — придумать лучший алгоритм. Это часто может дать значительный эффект. Книга Джона Бенсли «Programming Pearls» (это не опечатка!) также содержит полезные советы по оптимизации. Советы по бенчмаркингу сводятся к следующему: проводите бенчмаркинг и профайлинг, чтобы убедиться, что вы оптимизируете нужную часть, ищите лучшие алгоритмы вместо микронастройки своего кода, а в случае всего прочего подумайте о приобретении более быстрого оборудования. Вам, вероятно, захочется прочитать ответ на предыдущий вопрос «Как провести профайлинг моих программ Perl?», если вы этого еще не сделали.

Другой подход — автоматическая загрузка редко используемого кода Perl. Для этого см. модули AutoSplit и AutoLoader в стандартном дистрибутиве. Или вы можете найти узкое место и подумать о написании только этой части на C, как мы раньше находили узкие места в коде C и писали их на ассемблере. Аналогично переписыванию на C, модули, содержащие критические разделы, могут быть написаны на C (например, модуль PDL из CPAN).

Если вы в настоящее время связываете свой исполняемый файл Perl с общим libc.so, вы часто можете получить выигрыш в производительности от 10 до 25%, перестроив его для связывания со статическим libc.a вместо этого. Это приведет к увеличению размера исполняемого файла Perl, но ваши программы Perl (и программисты) могут вам за это поблагодарить. Дополнительную информацию см. в файле INSTALL в дистрибутиве исходных кодов.

Программа undump была древней попыткой ускорить программу Perl, сохраняя уже скомпилированную форму на диск. Это больше не жизнеспособный вариант, так как она работала только на нескольких архитектурах и вообще не была хорошим решением.

Как уменьшить потребление памяти моей программой Perl?

Когда дело доходит до компромиссов между временем и памятью, Perl почти всегда предпочитает тратить память на проблему. Скаляры в Perl используют больше памяти, чем строки в C, массивы занимают больше, а хеши — ещё больше. Хотя ещё многое предстоит сделать, последние версии устранили некоторые из этих проблем. Например, начиная с версии 5.004, дублированные ключи хешей совместно используются всеми хешами, которые их используют, поэтому не требуют перераспределения.

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

Ещё можно попробовать выяснить, была ли ваша программа Perl скомпилирована с системным malloc или с собственным malloc Perl. Какой бы ни был вариант, попробуйте использовать другой и посмотрите, повлияет ли это на результат. Информация о malloc содержится в файле INSTALL в дистрибутиве исходных кодов. Вы можете узнать, используете ли вы malloc Perl, набрав perl -V:usemymalloc.

Конечно, лучший способ экономии памяти — не делать ничего, что её тратит. Хорошие программистские практики могут значительно в этом помочь:

Не используйте «slurp»!

Не читайте весь файл в память, если вы можете обрабатывать его построчно. Или более конкретно, используйте цикл такого вида:

#
# Good Idea
#
while (my $line = <$file_handle>) {
   # ...
}

вместо этого:

#
# Bad Idea
#
my @data = <$file_handle>;
foreach (@data) {
    # ...
}

Когда обрабатываемые файлы небольшие, это не имеет большого значения, но это имеет огромное значение, когда они начинают расти.

Используйте map и grep выборочно

Помните, что и map, и grep ожидают аргумент LIST, поэтому выполнение этого:

@wanted = grep {/pattern/} <$file_handle>;

приведёт к загрузке всего файла. Для больших файлов лучше использовать цикл:

while (<$file_handle>) {
        push(@wanted, $_) if /pattern/;
}
Избегайте ненужных кавычек и строк

Не ставьте кавычки вокруг больших строк, если это не абсолютно необходимо:

my $copy = "$large_string";

создаёт 2 копии $large_string (одну для $copy и другую для кавычек), в то время как

my $copy = $large_string;

создаёт только одну копию.

То же самое относится к строковому представлению больших массивов:

{
local $, = "\n";
print @big_array;
}

гораздо эффективнее, чем либо

print join "\n", @big_array;

или

{
local $" = "\n";
print "@big_array";
}
Передача по ссылке

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

Привяжите большие переменные к диску

Для «больших» хранилищ данных (т.е. таких, которые превышают доступную память) рассмотрите использование одного из модулей базы данных для хранения их на диске вместо ОЗУ. Это приведёт к снижению времени доступа, но это, вероятно, лучше, чем привести ваш жёсткий диск к чрезмерной работе из-за огромного обмена данными.

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

Да. Система сбора мусора 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 ( http://par.perl.org/ ) — аналог Java JAR для Perl. Он свободно доступен и находится в CPAN ( http://search.cpan.org/dist/PAR/ ).

Также существуют некоторые коммерческие продукты, которые могут вам подойти, но для них необходимо приобрести лицензию.

Perl Dev Kit ( http://www.activestate.com/Products/Perl_Dev_Kit/ ) от ActiveState может «превратить ваши Perl-программы в готовые к запуску исполняемые файлы для HP-UX, Linux, Solaris и Windows».

Perl2Exe ( http://www.indigostar.com/perl2exe.htm ) — это командная программа для преобразования Perl-скриптов в исполняемые файлы. Она поддерживает как Windows, так и Unix-платформы.

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

Для OS/2 просто используйте

extproc perl -S -your_switches

в качестве первой строки в *.cmd файле (-S из-за ошибки в обработке "extproc" в cmd.exe). Для DOS сначала необходимо создать соответствующую командную партию и закодировать ее в ALTERNATE_SHEBANG (подробнее см. в файле dosish.h в исходном дистрибутиве).

При установке Win95/NT с использованием порта Perl от ActiveState регистр будет изменен для сопоставления расширения .pl с интерпретатором Perl. Если вы установите другой порт, возможно, даже собственный порт Perl Win95/NT из стандартных источников, используя Windows-порт gcc (например, с cygwin или mingw32), вам нужно будет изменить регистр самостоятельно. Помимо сопоставления .pl с интерпретатором, пользователи NT могут использовать: SET PATHEXT=%PATHEXT%;.PL для запуска программы install-linux.pl простым набором install-linux.

В «классической» системе MacOS у Perl-программы будут соответствующие Creator и Type, поэтому двойной щелчок по ним вызовет приложение MacPerl. В Mac OS X кликабельные приложения можно создать из любого #! скрипта с помощью утилиты DropScript от Wil Sanchez: http://www.wsanchez.net/software/ .

ВАЖНО!: Что бы вы ни делали, ПОЖАЛУЙСТА, не отчаивайтесь и не помещайте Perl-интерпретатор в каталог cgi-bin, чтобы ваши программы работали с веб-сервером. Это очень большая проблема безопасности. Выделите время, чтобы разобраться, как это сделать правильно.

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

Да. Подробнее см. perlrun. Ниже приведены некоторые примеры. (Эти примеры предполагают стандартные правила цитирования оболочки Unix.)

# sum first and last fields
perl -lane 'print $F[0] + $F[-1]' *

# identify text files
perl -le 'for(@ARGV) {print if -f && -T _}' *

# remove (most) comments from C program
perl -0777 -pe 's{/\*.*?\*/}{}gs' foo.c

# make file a month younger than today, defeating reaper daemons
perl -e '$X=24*60*60; utime(time(),time() + 30 * $X,@ARGV)' *

# find first unused uid
perl -le '$i++ while getpwuid($i); print $i'

# display reasonable manpath
echo $PATH | perl -nl -072 -e '
s![^/+]*$!man!&&-d&&!$s{$_}++&&push@m,$_;END{print"@m"}'

Хорошо, последний пример на самом деле был вступительной работой в конкурсе Obfuscated Perl. :-)

Почему 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» Дэмиана Конвея от Manning Publications или «Intermediate Perl» Рэнделла Шварца, Брайана Д. Фоя и Тома Феникса от O'Reilly Media.

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

Если вы хотите вызывать C из Perl, начните с perlxstut, перейдя к perlxs, xsubpp и perlguts. Если вы хотите вызывать Perl из C, прочитайте perlembed, perlcall и perlguts. Не забывайте, что вы можете многому научиться, изучая, как авторы существующих модулей расширений писали свой код и решали свои проблемы.

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

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

Загрузите набор ExtUtils::Embed с CPAN и выполните `make test'. Если тесты пройдены, перечитайте под ещё и ещё раз. Если тесты не пройдены, обратитесь к 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.

АВТОР И АВТОРСКИЕ ПРАВА

Авторские права (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.28.3/perlfaq3

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API