perl — вопросы с ответами

Общие особенности

Perl – замечательный язык. По мнению многих программистов, это самая успешная модульная среда программирования.

Фактически, модули Perl являются самыми близкими к легендарным "software IC" (то есть программным эквивалентом интегральных микросхем, компонентов, которые могут использоваться в различных приложениях без понимания всей их внутренней работы), которые видел мир программного обеспечения. Для этого есть множество причин, одна из наиболее важных состоит в том, что существует централизованный, скоординированный репозиторий модулей CPAN, который уменьшает количество энергии, расходуемой на конкурирующие несовместимые реализации функциональности.

Преимущества

Perl имеет минималистическую, но достаточную модульную и объектно-ориентированную среду программирования. Отсутствие обширных функций контроля доступа в языке позволяет писать код с необычными характеристиками в естественной, сжатой форме. Естественным законом программного обеспечения является то, что наиболее полезные функции – это те, которые наиболее плохо соответствуют существующим средам. Скелетный подход Perl к "правилам и нормам" фактически подрывает этот закон.

Perl обеспечивает отличную кроссплатформенную совместимость. Он превосходит как инструмент системного администрирования в UNIX, поскольку он в максимально возможной степени скрывает различия между различными версиями UNIX. Можете ли вы написать кроссплатформенные сценарии оболочки? Да, но с чрезвычайной сложностью. Большинство простых смертных не должны пытаться делать такие вещи. Можете ли вы написать кроссплатформенные сценарии Perl? Да легко. Perl также достаточно хорошо переносит порт между UNIX и другими платформами, такими как Windows, VMS и многими другими.

Как программист на Perl, у вас есть лучшая поддержка в мире. У вас есть полный доступ к исходному коду для всех используемых вами модулей, а также полный исходный код для самого языка. Если поиск ошибок не для вас, у вас есть онлайн поддержка 24 часа в сутки, 7 дней в неделю. Если бесплатная поддержка не в вашем стиле, вы также можете купить коммерческую поддержку.

Наконец, у вас есть язык, который смеет быть другим. Perl – это жидкость. В лучшем случае, при наличии нескольких альтернативных интерпретаций, Perl делает то, что вы имеете в виду (иногда его называют DWIM, "делайте то, что я имею в виду"). Возможно, это немного страшная мысль, но это показатель истинного прогресса в вычислительной технике, который выходит за рамки простых циклов, дискового пространства и оперативной памяти.

Терминология

В общем, терминология, используемая в Perl, ничем не отличается от терминологии, используемой для описания других языков программирования. Тем не менее, есть несколько терминов со слегка своеобразными значениями. Кроме того, по мере развития Perl, некоторая терминология вышла из моды, и на ее месте возникла новая.

Как правило, язык называется Perl с большой буквы, а perl – это имя программы, которая компилирует и запускает ваш исходный код. Если мы не ссылаемся конкретно на интерпретатор, мы по умолчанию используем заглавную версию.

Оператор в Perl является синтаксической конструкцией без скобок. (аргументы оператора могут, конечно, содержаться в скобках.) Оператор списка, в частности, представляет собой идентификатор, за которым следует список элементов, разделенных запятыми:

Функция в Perl – это идентификатор, за которым следует пара круглых скобок, которые полностью заключают аргументы:

Теперь вы, возможно, только что заметили определенное сходство между операторами списков и функциями. На самом деле, в Perl между ними нет никакой разницы, кроме используемого синтаксиса. Обычно мы будем использовать термин “operator”, когда будем ссылаться на встроенные функции Perl, такие как print и open, но иногда можем использовать “function”. Особой разницы в значении нет.

Правильный способ ссылки на подпрограмму, написанную на Perl, – это просто подпрограмма. Конечно, “function,” “operator,” и даже “procedure” являются приемлемыми литературными заменами. Обратите внимание, что использование Perl “function” не совпадает с математическим определением, и некоторые компьютерные ученые могут содрогнуться от злоупотребления этим термином в Perl.

Все методы Perl на самом деле являются подпрограммами, которые соответствуют определенным соглашениям. Эти соглашения не требуются и не признаются Perl. Однако целесообразно использовать такие фразы, как call a method, поскольку Perl имеет специальный синтаксис вызова метода, который используется для поддержки объектно-ориентированного программирования. Хороший способ определения различия состоит в том, что метод – это подпрограмма, которую автор намерен вызывать с помощью синтаксиса вызова метода.

Идентификатор Perl представляет собой "символ C" – букву или подчеркивание, за которым следуют одна или несколько букв, цифр или подчеркиваний. Идентификаторы используются для именования переменных Perl. Переменные Perl – это идентификаторы в сочетании с соответствующей пунктуацией, как в $a или &func.

Основы Perl

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

Например, вы уже должны знать, что переменная Perl обычно состоит из некого знака пунктуации, такого как $ или @, за которым следует идентификатор. Но знаете ли вы, что различные типы переменных с одинаковыми именами, такие как $a и @a, полностью независимы друг от друга? Вы должны знать, что @a - это массив, но знаете ли вы разницу между $a[$i] и @a[$i]? Вы должны знать, что число 0 является ложным, и что пустая строка '', является ложной, но знаете ли вы, является ли строка, состоящая из одного пробела ложной?

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

Perldoc reader

Команда perldoc ищет в дереве Perl модули Perl (.pm) со встроенной документацией, pod-файлами только для документации (Item 82) и установленными программами Perl. Команда perldoc форматирует и отображает найденную документацию. Для начала прочитайте собственную документацию perldoc:

В общем, вы даете perldoc имя страницы документации, которую вы хотите прочитать. Perltoc – это оглавление, которое показывает все имена страниц:

Вас может заинтересовать perlsyn, страница, на которой обсуждается общий синтаксис Perl:

Если вы хотите прочитать о встроенных модулях Perl, посмотрите в perlfunc:

Вы должны прочитать perlfunc хотя бы один раз, чтобы увидеть все, что может предложить Perl. Вам не нужно запоминать все, но вы возможно позже вспомните, что в Perl есть встроенная программа, скажем, для взаимодействия с файлом /etc/passwd, даже если вы не помните, как называется эта встроенная программа. Вы также заметите, что крайне неудобно прокручивать вывод, чтобы найти нужную вам встроенную функцию.

Идиоматический Perl

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

То, что мы называем идиоматическим Perl, представляет собой смесь элегантности и обычаев, которая естественна для программистов Perl. Есть много разных способов выразить как простые, так и сложные алгоритмы в Perl. Некоторые способы, однако, явно более "правильные", чем другие. Хотя девиз Perl может звучать так: "Существует больше, чем один способ сделать это", следствие звучит так: "Но большинство из них неправильны" или "Некоторые способы лучше других".

Идиома и соглашение очень важны в Perl. Они менее важны в простых языках, таких как C и Bourne или C shell. В программировании на С не нужно слишком много приемов. Вы можете подумать, что мы сумасшедшие, чтобы сказать такое, но если вы посмотрите на раздел программирования вашего местного книжного магазина, вы увидите, что все книги о том, как делать умные вещи в C, довольно тонкие. Это книги по C++, которые толстые. И хотя есть много деталей, которые необходимо изучить при поддержке программирования оболочки, подробное руководство по программированию оболочки также невелико.

С Perl все не так, ведь это выразительный язык, и часто лаконичный. Ларри Уолл разработал язык, позволяющий очень компактно кодировать часто используемые конструкции. Иногда программисты на Perl говорят о кодировании в Perl Хаффмана: наиболее часто используемые конструкции требуют меньше всего нажатий клавиш. Особые возможности Perl, такие как <>, регулярные выражения и grep, особенно эффективны. Например:

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

В определенной степени идиома и стиль частично совпадают. Некоторые идиомы, такие как print sort <>, неоспоримы, но есть определенные серые области:

Первый пример выше – это очень простой Perl. Он эффективен и удобен для чтения и использует только основные функции языка. Второй пример короче и, как некоторые могут поспорить, имеет более крутой вид, потому что он использует изящный оператор отображения и контекст списка, вместо обычного цикла foreach. Тем не менее, вы должны оценить себя и свою потенциальную аудиторию, прежде чем оставлять свой код в виде второго примера.

Каждый программист Perl должен овладеть рядом основных идиом и научиться распознавать ряд других. Программисты должны всегда использовать те идиомы, которые производят эффективный, сжатый и читаемый код. Другие, более сложные идиомы могут быть или не быть подходящими, в зависимости от программиста, аудитории и характера написанной программы.

5 ответов
Я запускаю ActiveState 32-разрядный ActivePerl 5.14.2 в Windows 7. Я хотел объединиться с крюком Git pre-commit для обнаружения программ, проверяемых с синтаксическими ошибками. (Как-то мне просто удалось сделать такую плохую фиксацию.) Так что, как тестовая программа, я случайно записал это: use s...
27 июль 2012, в 21:34
4 ответа
Есть ли регулярное выражение для соответствия "всем символам, включая символы новой строки"? Например, в приведенном ниже выражении нет результата из $2, потому что (.+?) не содержит новые строки при сопоставлении. $string = "START Curabitur mollis, dolor ut rutrum consequat, arcu nisl ultrices diam...
28 нояб. 2011, в 22:15
4 ответа
Я использую SetEnv в Apache для установки некоторых переменных в virtualhosts, которые я восстанавливаю на PHP, используя $_SERVER[the_variable]. Теперь я перехожу к Perl Catalyst и Nginx, но похоже, что директива env в Nginx не то же самое. Это не работает. Как это можно сделать? Вот фоновое изобра...
nginx
catalyst
11 нояб. 2011, в 17:30
10 ответов
Кажется, я нашел несколько разных способов найти размер массива. В чем разница между этими тремя методами? my @arr = (2); print scalar @arr; # First way to print array size print $#arr; # Second way to print array size my $arrSize = @arr; print $arrSize; # Third way to print array size ...
13 сен. 2011, в 17:43
6 ответов
Интересно, почему большинство современных решений, построенных с использованием Perl, не позволяют UTF-8 по умолчанию. Я понимаю, что для основных сценариев Perl существует много устаревших проблем, где это может нарушить работу. Но, с моей точки зрения, в 21 веке, большие новые проекты (или проекты...
unicode
utf-8
28 май 2011, в 16:55
6 ответов
Я иногда хочу совместить пробелы, но не новую строку. До сих пор я прибегал к [ \t]. Есть ли менее неудобный способ?
12 авг. 2010, в 16:00
25 ответов
У меня есть файл, который содержит несколько тысяч номеров, каждый на своей собственной строке: 34 42 11 6 2 99 ... Я хочу написать script, который будет печатать сумму всех чисел в файле. У меня есть решение, но оно не очень эффективно. (Требуется несколько минут для запуска.) Я ищу более эффектив...
24 апр. 2010, в 00:48
36 ответов
Когда я запускаю perl, я получаю предупреждение: perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = (unset), LANG = "en_US.UTF-8" are supported and installed on your system. perl: warning: Falling back to the standard...
locale
23 март 2010, в 11:31
21 ответ
У меня есть несколько файлов, которые я бы хотел удалить последней новой строкой, если это последний символ в файле. od -c показывает мне, что команда, которую я запускаю, записывает файл с завершающей новой строкой: 0013600 n t > \n Я пробовал несколько трюков с sed, но лучшее, что я мог ...
awk
sed
31 окт. 2009, в 10:47
8 ответов
Я пробовал: $var = false; $var = FALSE; $var = False; Ни одна из этих работ не работает. Я получаю сообщение об ошибке Bareword "false" not allowed while "strict subs" is in use.
boolean
24 июнь 2009, в 05:13
8 ответов
Я хотел бы настроить Apache 2, работающий на Kubuntu, для выполнения сценариев Perl CGI. Я пробовал некоторые шаги, которые мне попадались в поисковых системах, но ничего не работает. Каков правильный способ достижения этого?
18 фев. 2009, в 11:46
5 ответов
просто хочу знать, в чем главные различия между ними? и власть каждого языка (где его лучше использовать). Изменить: это не "против" как тема, просто информация.
awk
sed
language-comparisons
14 дек. 2008, в 20:22
4 ответа
Я пытаюсь использовать оператор break в цикле for, но поскольку я также использую строгие подмножества в своем коде Perl, я получаю сообщение об ошибке: Запрет "разбить" "строгие субтитры" в использовании на. /final.pl строка 154. Есть ли обходной путь для этого (помимо отключения строгих подсисте...
loops
strict
break
19 нояб. 2008, в 19:07
22 ответа
Как запустить интерактивную консоль для Perl, аналогичную команде irb для Ruby или python для Python?
console
interactive
read-eval-print-loop
16 сен. 2008, в 17:20
7 ответов
В Perl, что является хорошим способом выполнить замену строки с использованием регулярного выражения и сохранить значение в другой переменной без изменения оригинала? Обычно я просто копирую строку в новую переменную, а затем привязываю ее к регулярному выражению s///, который заменяет новую строку,...
replace
22 авг. 2008, в 18:24
Наверх
Меню