Spec-Zone.ru › Perl 5.38

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

END_OF_DOCUMENT_MARKER

Прежде чем делать что-либо ещё, вы можете помочь себе, убедившись, что вы позволили Perl сообщить вам о проблемных областях в вашем коде. Включив предупреждения и ограничения, вы можете предотвратить многие проблемы, прежде чем они станут слишком большими. Вы можете узнать больше об этом в строгих ограничениях и предупреждениях.

#!/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» by Simon Cozens https://www.perl.com/pub/2004/06/25/profiling.html/ и «Debugging and Profiling mod_perl Applications» by Frank Wiles http://www.perl.com/pub/a/2006/02/09/debug_mod_perl.html.

Randal L. Schwartz пишет о профилировании в «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-mode или более новые cperl-mode для 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

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

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

Enginsite

http://www.enginsite.com/

Perl Editor от 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. Это одна из более новых Perl IDE.

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

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://invisible-island.net/vile/vile.html

Ниже перечислены редакторы/IDE Win32 с поддержкой Perl:

MultiEdit

http://www.MultiEdit.com/

SlickEdit

http://www.slickedit.com/

ConTEXT

http://www.contexteditor.org/

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

http://www.zsh.org/

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

BBEdit и TextWrangler

являются текстовыми редакторами для OS X, имеющими режим Perl ( http://www.barebones.com/ ).

Где можно получить макросы Perl для vi?

Полную версию файла конфигурации vi от Тома Кристиансена см. по адресу http://www.cpan.org/authors/id/T/TO/TOMC/scripts/toms.exrc.gz , стандартный эталонный файл для эмуляторов vi. Файл лучше всего работает с nvi, текущей версией vi из Беркли, которая, кстати, может быть скомпилирована со встроенным интерпретатором Perl — см. http://www.cpan.org/src/misc/ .

Где получить perl-mode или cperl-mode для emacs?

С версии Emacs 19 с патчем 22 или около того, есть и perl-mode.el, и поддержка Perl отладчика, встроенные в Emacs. Это должно быть включено в стандартное распределение Emacs 19.

Обратите внимание, что режим perl в 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.

Как написать GUI (X, Tk, Gtk и т.д.) на Perl?

(предложено Бен Мороу)

Существует ряд модулей, позволяющих писать GUI на Perl. Большинство GUI-наборов инструментов имеют Perl-интерфейс: следует неполный список.

Tk

Это работает под Unix и Windows, и текущая версия выглядит не так плохо под Windows, как раньше. Некоторые элементы интерфейса по-прежнему не кажутся правильными. Интерфейс очень естественный и «перлический», что упрощает его использование в небольших скриптах, которым требуется простое GUI. Он не обновлялся некоторое время.

Wx

Это Perl-связка для кроссплатформенного набора инструментов wxWidgets ( http://www.wxwidgets.org ). Он работает под Unix, Win32 и Mac OS X, используя родные виджеты (Gtk под Unix). Интерфейс тесно следует за C++ интерфейсом, но документация немного скудна для тех, кто не знаком с библиотекой, в основном она просто направляет вас к C++ документации.

Gtk и Gtk2

Это Perl-связки для набора инструментов Gtk ( http://www.gtk.org ). Интерфейс существенно изменился между версиями 1 и 2, поэтому они имеют отдельные Perl-модули. Он работает под Unix, Win32 и Mac OS X (в настоящее время он требует X-сервер на Mac OS, но «родной» порт находится в разработке), и виджеты выглядят одинаково на всех платформах: т.е. они не соответствуют родным виджетам. Как и в случае с Wx, Perl-связки тесно следуют за C-API, а документация требует от вас чтения C-документации для её понимания.

Win32::GUI

Это предоставляет доступ к большинству виджетов Win32 GUI из Perl. Очевидно, что он работает только под Win32 и использует родные виджеты. Perl-интерфейс не совсем следует за C-интерфейсом: он был сделан более «перлическим», а документация довольно хороша. Для более сложных задач может потребоваться знакомство с C-API Win32 или ссылка на 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-программы?

Лучший способ сделать это — придумать лучший алгоритм. Это часто может кардинально повлиять на результат. В книге Джона Бентли «Программистские жемчужины» (это не опечатка!) есть полезные советы по оптимизации. Советы по бенчмаркингу сводятся к следующему: производить бенчмаркинг и профилирование, чтобы убедиться, что вы оптимизируете нужную часть, искать лучшие алгоритмы вместо микронастроек своего кода, и, если все остальное не помогает, стоит рассмотреть покупку более быстрого оборудования. Вероятно, вам нужно будет прочитать ответ на предыдущий вопрос «Как профилировать мои 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 ОС, а не встроенного 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 из стандартных исходных кодов, используя порт gcc для Windows (например, с cygwin или mingw32), то вам придётся изменить регистр самостоятельно. В дополнение к сопоставлению .pl с интерпретатором, пользователи NT могут использовать: SET PATHEXT=%PATHEXT%;.PL для запуска программы install-linux.pl путём простого набора install-linux.

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

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

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

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

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

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

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

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

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

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

Хорошо, последний пример был на самом деле задачей конкурса «Запутанный 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-символы как управляющие символы.

Использование qq(), q() и qx() вместо «двойных кавычек», 'одинарных кавычек' и `обратных кавычек` может упростить написание однострочных программ.

Нет общего решения для всего этого. Это запутанная тема.

[Часть этого ответа была предоставлена Kenneth Albanowski.]

Где я могу узнать о программировании CGI или веб-программировании на Perl?

Для модулей получите модули CGI или LWP из CPAN. Для учебников посмотрите те, что посвящены веб-программированию в вопросе о книгах. Для проблем и вопросов, связанных с веб-программированием, таких как «Почему у меня возникают ошибки 500» или «Почему это не работает в браузере, когда работает в командной строке», см. руководства по устранению неполадок и ссылки в perlfaq9 или в CGI MetaFAQ:

L<http://www.perl.org/CGI_MetaFAQ.html>

Однако настоятельно рекомендуется изучить https://plackperl.org и современные фреймворки веб-программирования на Perl; веб-программирование на Perl сильно продвинулось с давних времён простых скриптов CGI.

Где я могу узнать об объектно-ориентированном программировании на Perl?

Хорошим началом является perlootut, и вы можете использовать perlobj для справки.

Хорошей книгой по объектно-ориентированному программированию на Perl является «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'. Если тесты пройдены, перечитайте 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–2023 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.38.0/perlfaq3

Spec-Zone.ru

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