perl параметры командной строки
Perl — особенный язык программирования
Он может связать два любых проекта в одно целое.
Есть такой язык программирования — Perl. Если вы заинтересовались информационными технологиями в эпоху Python и JavaScript, вы, вероятно, даже не знаете, что он существует — а он есть и его много. Если представить, что наши ИТ-проекты — это красивые квартиры с евроремонтом, то Perl можно представить как старые магистральные трубы, по которым вода приходит в квартиру.
Ещё Perl называют «скотчем для интернета», потому что он может соединять какие угодно проекты, написанные на любых языках:
Perl хорошо умеет запускать системные команды в операционной системе. Благодаря этому Perl может взять результат работы одной программы, преобразовать их как нужно и отдать в другую.
✅ Суперсила Perl — в работе с регулярными выражениями, полная поддержка которых уже встроена в язык. Perl может взять любые данные, обработать их по нужным правилам и очень быстро выдать результат в удобном для пользователя виде.
❌ Слабое место Perl — его сложность для новичков, если выбрать его своим первым языком для изучения. В нём всё не так просто с ООП, слишком вольная трактовка операторов сравнения и огромные комбинации спецсимволов, в которых сложно разобраться на старте. Поэтому Perl лучше не выбирать как первый язык, а вернуться к нему, когда возникнет практическая необходимость.
Если у вас MacOS или Linux — у вас уже есть Perl
Интерпретатор Perl встроен почти во все UNIX-подобные операционные системы, поэтому его можно использовать в любой момент без установки. Единственное, что нужно проверить — что в системных настройках правильно указан путь к интерпретатору.
Если у вас Windows, то всё сложнее — нужно будет использовать отдельный интерпретатор, написанный специально для вашей версии Windows. Дополнительный минус — так как это не родная среда для Perl, часть команд в таком режиме совместимости работать не будет.
Синтаксис
Синтаксис Perl похож одновременно на два языка:
Переменные. Начинаются со специальных символов:
$ — число, строка или ссылка на что-то
$thecode = «Привет, это журнал Код!»
& — функция (в Perl это тоже переменная), которая получает аргументы и возвращает значение
Условный оператор. Почти такой же как в C:
$a = shift;
if($a > 10) <
print «a > 10\n»;
>
Ещё есть unless — то же самое, что ЕСЛИ, только наоборот:
unless($a == 0) <
# «выполняется, только если a не равно нулю»
>
Циклы. То же самое, как и везде:
Или можно сделать как в PHP:
Циклы с пред- и постусловием. Если вы знаете хотя бы Pascal, то вы знаете и циклы на Perl:
Операторы присваивания и математические операторы. В этом плане Perl очень похож на любой C-подобный язык и использует те же самые команды:
Применение на практике
Perl — мощный язык для работы с текстом и любыми символьными данными. На нём легко писать программы, которые автоматизируют работу с компьютером, выполняют рутинные операции или преобразуют одни данные в другие.
Например, эта команда
заменит все упоминания слова Java на слово Perl в файле resume.txt, и одновременно сделает резервную копию оригинального файла.
А эта — удаляет все повторяющиеся элементы массива:
Если нужно очистить файл от всех HTML-команд, можно использовать такой код:
use strict;
use utf8;
use HTML::Entities;
# исходим из того, что мы уже получили содержимое HTML-файла и можем с ним работать
utf8::decode($_);
s/ ]*>//g;
decode_entities($_);
utf8::encode($_);
Иногда это всё-таки сложно
Иногда готовый код на Perl сложно понять и прочитать. Это из-за того, что Perl — очень гибкий язык программирования с полной поддержкой регулярных выражений. Чтобы понять, что делают некоторые программы и функции, недостаточно просто посмотреть на них — нужно понимать правила преобразования регулярных выражений и знать, как одни команды в регулярках влияют на другие.
Самый популярный пример такого кода:
❌❌❌ И этот код тоже не запускайте — можно легко стереть все свои данные и повредить файловую систему.
Не все программы на Perl выглядят как эта, но без понимания того, как работают регулярные выражения, понять код бывает очень сложно.
Вывод: регулярные выражения — это сила. Убедились в этом в очередной раз. Если ещё не убедились — почитайте, как с их помощью можно настроить автозамену нецензурной лексики на благопристойные выражения.
Что пишут на Perl
Если коротко: всё, где нужно автоматизировать работу компьютера или преобразование данных, можно написать на Perl.
Системное программирование. Сюда можно отнести работу с учётными записями пользователей в сетях любой сложности и конфигурации, администрирование сетей и пользователей в организации. Ещё Perl используют для автоматизации рутины — наладить резервное копирование по расписанию, отправку писем с ежедневными отчётами, сбор, обработку и анализ разных данных.
CGI-скрипты — любые скрипты для обмена данными между сервером и клиентом. Для Perl неважно, в каком виде данные выходят и поступают обратно, — он переведёт их в нужный вид и отправит из одного сервиса в другой.
Объединение сервисов или программ. Если у вас есть две программы, одна из которых выдаёт готовый результат в одном формате, а другой он требуется в другом формате, то Perl поможет вам их соединить. Работает это так: вы пишете скрипт, который запускает первую программу, получает оттуда данные, преобразует их в нужный вид и отправляет во вторую программу. В итоге всё это работает как одно целое.
Востребован ли Perl сейчас
Perl востребован, потому что в мире накопилось много старого кода, который нужно поддерживать. Дело в том, что программы на Perl работают стабильно, предсказуемо и без сбоёв, а с 1987 года их написано очень много.
Но порог входа в этот язык довольно высок — нужно обладать навыками хотя бы на уровне мидла, чтобы быть востребованным специалистом.
С чего начать
Почитать: учебник по Perl для новичков. Перевод иногда хромает, но это лучший вариант для тех, кто только начинает изучение языка.
Если знаете английский — начните с официальной страницы языка.
Посмотреть: Perl Tutorial или Great Perl Tutorial For Begginers. Тут уже всё на английском, зато более наглядно.
Бумажная книга: Изучаем Perl Рэндала Шварца и Тома Феникса. Для тех, кто любит основательно подойти к процессу и не любит читать с экрана.
Как передать аргументы командной строки программе Perl?
Я работаю над Perl script. Как передать параметры командной строки?
Зависит от того, что вы хотите сделать. Если вы хотите использовать два аргумента в качестве входных файлов, вы можете просто передать их, а затем использовать <> для чтения их содержимого.
напечатает каждый аргумент.
В качестве альтернативы, более сексуальный perlish way…..
“Предполагается, что пройдены два значения. Дополнительный код может подтвердить, что предположение безопасно.
Затем назовите его следующим образом:
Или посмотрите исходную статью для получения более подробной информации:
Вы можете получить к ним доступ напрямую, назначив специальную переменную @ARGV в список переменных.
Итак, например:
perl tmp.pl 1 2 3 4 5
Если аргументы являются именами файлов, которые необходимо прочитать, используйте оператор diamond ( ), чтобы получить их содержимое:
Если аргументы являются параметрами/переключателями, используйте GetOpt:: Std или GetOpt:: Long, как уже показано slavy13.myopenid.com.
В случае непредвиденных обстоятельств вы можете получить к ним доступ либо с помощью команды @ARGV, либо с помощью команды shift :
Если вам просто нужны некоторые значения, вы можете просто использовать массив @ARGV. Но если вы ищете что-то более мощное для обработки некоторых параметров командной строки, вы должны использовать Getopt:: Long.
Ввод-вывод в Perl
Начав читать книгу «Шварц Р., Фой Б., Феникс Т. — Perl. Изучаем глубже. 2-е издание», понял, что немного запутался в способах ввода-вывода Perl. Для этого решил сделать вот-такой конспект, который хочу предложить вашему вниманию.
Работа с аргументами вызова скрипта
Аргументы вызова скрипта заносятся в массив @ARGV, т.е. для следующего вызова
$ perl test.pl lesson1 lesson2 lesson3
массив @ARGV будет содержать qw/lesson1 lesson2 lesson3/.
Эти две пары строк эквивалентны, за одним исключением — версии с аргументом по-умолчанию не должны вызываться внутри подпрограммы, т.к. там имеется своя переменная по-умолчанию — @_. Приведем пример:
$ perl test.pl hello world
arg1: hello
(name arg2) = (TheAthlete world)
$
На самом деле операция pop выполняется довольно редко.
$ perl test.pl
Enter name: Fred
Name: Fred
$
При достижении конца файла (в данном примере это ввод Ctrl+d в Linux или Ctrl+z в Windows вместо ввода имени) оператор построчного вывода возвращает undef. Чтобы было более понятно, этот пример можно переписать следующим способом:
$ perl test.pl
Enter name: или
Пустая строка ввода
$
Также, это обстоятельство часто используется для выхода из цикла:
$ perl test.pl
Enter name: Vasya
Name: Vasya
Petya
Name: Petya
Kolya
Name: Kolya
или
$
Для такой простой ситуации, как эта, есть сокращенная версия:
Данную версию следует использовать только для простых вариантов. Для более сложных конструкций лучше использовать именованные переменные, а не переменные по-умолчанию.
Оператор построчного ввода может работать также в списочном контексте:
$ perl test.pl
Enter names: Fred
Wilma
Kolya
Sanya
names: Fred Wilma Kolya Sanya
Ввод данных оператором <>
Оператор <> является особой разновидностью оператора построчного ввода. Но вместо того, чтобы получать входные данные с клавиатуры, он берет их из источников, выбранных пользователем:
test1.txt
test1 text
test2.txt
test2 text
test3.txt
test3 text
$ perl test.pl test1.txt test2.txt test3.txt
test1 text
test2 text
test3 text
Как и в случае с оператором построчного ввода, данную программу можно существенно сократить:
Данная программа последовательно проходит каждую строку в каждом файле. При использовании оператора <> все выглядит так, словно входные файлы объединены в один большой файл. Оператор <> возвращает undef (что приводит к выходу из цикла while) только в конце всех входных данных.
Получение списка файлов по шаблону.
Если требуется получить список файлов по шаблону, аналогичному конструкциям *.* (MS-DOS, Windows) и *.h (UNIX), то можно воспользоваться следующей записью:
Также оператор <> может применяться к файловым дескрипторам, но в этой статье я не буду освещать данную тему.
Глава 14. Запуск интерпретатора и режим отладки
Внутренний отладчик, которым снабжен интерпретатор perl, неоценим при отладке сложных сценариев Perl, особенно при разработке собственных модулей. Конечно, по общему признанию апологетов Perl, возможности его отладчика не так изощренны, как в С, C++ или Visual Basic, однако они могут оказаться мощным средством выявления ошибок, не обнаруживаемых самим компилятором даже в режиме отображения предупреждений.
В этой главе мы познакомимся с некоторыми опциями командной строки интерпретатора и их использованием для решения повседневных задач системного администрирования. Узнаем, как можно воспользоваться встроенным отладчиком в системе UNIX, а также изучим необходимый набор команд отладчика для выполнения основных действий в процессе обнаружения ошибок программ Perl.
Опции командной строки
Наиболее общая форма синтаксиса строки запуска интерпретатора perl имеет следующий вид:
perl [опции] [—] [файл_программы] [параметры_программы]
Опции perl задаются сразу же после имени интерпретатора и представляют собой двухсимвольные последовательности, начинающиеся с дефиса «-«:
Некоторым из них может потребоваться передать параметры, которые задаются непосредственно после соответствующих опций:
Опции без параметров можно группировать, задавая целую группу с одним дефисом. Следующие вызовы perl эквивалентны:
Опции с параметрами таким способом задавать нельзя. Можно, однако, одну опцию с параметром добавить в конец группы опций без параметров:
Передать опции для установки соответствующего режима работы интерпретатора можно непосредственно и из самой программы Perl. Первая строка сценария со специальным комментарием #! предназначена именно для этой цели:
Теперь настало время узнать, какие опции существуют и как они влияют на режим работы интерпретатора. Мы решили сначала перечислить все возможные опции perl, а потом объяснить использование некоторых из них для выполнения задач системного администрирования UNIX. В табл. 14.1 представлены все опции с их кратким описанием. Советуем читателю внимательно ознакомиться с содержанием этой таблицы, так как для некоторых опций приведенное краткое описание в то же время является и исчерпывающим для понимания существа данной опции.
Таблица 14.1. Опции командной строки
Проверка синтаксиса программы без ее выполнения (блоки BEGIN, END и use выполняются, так как это необходимо для процесса компиляции)
Запускает сценарий в режиме отладки под управлением модуля отладки или трассировки, установленного как
Устанавливает флаги отладки
Поиск файла программы Perl файл программы осуществляется с использованием значения переменной среды PATH
Включает режим проверки на безопасность полученных извне данных в операциях с файловой системой. Полезен при реализации CGI-сценариев. Эта опция должна быть первой в списке опций интерпретатора perl, если она применяется к сценарию
Создание дампа ядра после компиляции сценария Perl. Последующее использование программы undump позволяет создать двоичный выполняемый файл сценария
Разрешает выполнение небезопасных операций. При использовании этой опции в UNIX программа Perl выполняется в незащищенном режиме и ей предоставляется полный доступ к файловой системе
Отображает номер версии, а также другую важную информацию об интерпретаторе perl
Отображает информацию конфигурации интерпретатора perl (расположение необходимых библиотек, значения переменных среды и т. д.). Если задано имя переменной среды, отображает ее установленное значение
Включает режим отображения предупреждений во время компиляции программы Perl. Рекомендуется всегда применять эту опцию
Как видно из табл. 14.1, интерпретатор perl располагает достаточно большим набором опций, разработанных специально в помощь системному администратору UNIX. Эти опции позволяют решать задачи, даже не прибегая к созданию текстового файла сценария Perl.
Итак, мы хотим в конфигурационных файлах configl, config2 и configS, содержащих строки вида ключ = ЗНАЧЕНИЕ, изменить значение ключа «кеу!» на величину 5. Эта задача решается следующим вызовом perl из командной строки:
При работе с интерпретатором из командной строки очень часто используются регулярные выражения для отображения какой-либо части содержимого файла. Следующий вызов perl отображает на экране монитора последний столбец данных из файла test.dat (элементы столбцов в строке файла разделены пробелами):
Можно было бы привести еще массу полезных примеров вызова интерпретатора perl с различными опциями для решения разнообразных задач, но мы ограничимся приведенными примерами. При написании этой главы мы ставили целью всего лишь показать, на что способен интерпретатор perl. Думайте, размышляйте, и вы сможете решать многие задачи, не прибегая к написанию больших файлов с кодом Perl.
Отладчик Perl
Написав программу и устранив ошибки компиляции, любой программист втайне надеется, что она будет работать именно так, как он и задумывал. Практика, однако, в большинстве случаев совершенно иная: при первом запуске программа работает, но выполняет не совсем, а иногда и совсем не то, что надо; при одних исходных данных она работает идеально, а при других «зависает». И это случается не только с начинающим, но и с опытным программистом. В таких случаях на помощь приходит отладчик — специальная программа, которая позволяет программисту, обычно в интерактивном режиме, предпринять определенные действия в случае возникновения необычного поведения программы.
Loading DB routines from perl5db.pl version 1.0402 Emacs support available.
Enter h or *h h’ for help.
main::(examplel.pl:3): print «\000\001\002\003\004\005\006\007\n»; DB
После чего можно вводить команды отладчика для выполнения определенных действий: установить точки останова, определить действия при выполнении определенной строки кода Программы, посмотреть значения переменных, выполнить часть кода сценария и т. д. Эта глава и посвящена краткому описанию команд, задающих необходимые действия при отладке разработанного сценария Perl. Мы здесь не учим стратегии поиска ошибок, а только лишь показываем возможности отладчика при ее реализации.
Замечание |
Все, что здесь говорится о встроенном отладчике, относится к пользователям системы UNIX. Тот, кто работает в системах семейства Windows и пользуется интерпретатором perl фирмы ActiveState, может совсем не читать этот раздел, так как интерпретатор этой фирмы снабжен отладчиком, работа с которым осуществляется через графический интерфейс пользователя, а не с помощью командной строки. Хоти ничто не мешает таким пользователям воспользоваться встроенным отладчиком, аналогичным отладчику интерпретатора perl для UNIX, и работать с ним из командной строки. Для этого следует воспользоваться командным файлом cmddb.bat, расположенным в каталоге \perl520\debugger. |
Просмотр текста программы
При загрузке отладчика отображается первая строка кода программы Perl. Но для выполнения определенных действий (установки точки останова, задания определенных действий при выполнении конкретного оператора Perl и т. д.) нам необходимо видеть текст программы. Как это осуществить? В отладчике для подобных действий предусмотрен ряд команд.
Команда i отображает на экране монитора 10 строк текста программы, расположенных непосредственно за последней отображенной строкой. Последовательное выполнение этой команды позволяет быстро пролистать текст программы. Вызов команды i с указанием номера строки отобразит ее содержимое. Несколько последовательных строк программы можно увидеть, задав в команде i через дефис номер начальной и конечной строки. Например, команда 1 1-5 отобразит пять строк программы:
Обратите внимание, что отладчик отображает не только содержимое строк, но и их номера, причем после номера строки с первым выполняемым оператором следует стрелка, а номер каждой последующей выполняемой строки завершается символом двоеточие «:». В угловых скобках приглашения отладчика ов отображается порядковый номер выполненной команды от начала сеанса отладки.
Команда w отобразит блок, или окно строк — три строки до текущей, текущая строка и шесть после текущей. Текущей в отладчике считается строка программы после последней отображенной. Если команде w передать номер строки, то отобразится окно строк относительно заданной строки текста — три строки до заданной, сама заданная строка и шесть после нее.
Выполнение кода
Команда s предназначена для последовательного пошагового выполнения программы: каждый ее вызов выполняет следующую строку кода. Эта строка должна выполняться в программе без изменения потока выполнения операторов. После выполнения очередной строки кода отображается строка, которая должна быть выполнена следующей:
DB s main: : (exaitple2.pl:3) : @s = split;
При следующем выполнении команды s будет выполнена отображенная строка программы:
Если следующая выполняемая строка кода расположена в модуле, код которого доступен (например, вызов подпрограммы), то осуществляется переход в него, соответствующая строка кода выполняется и отладчик приостанавливает выполнение программы до ввода следующей программы. Последующие команды s будут построчно выполнять код подпрограммы, пока не выполнится последняя строка ее кода. Таким образом, команда s позволяет выполнять подпрограмму с заходом в нее.
Команда п работает аналогично команде s, последовательно выполняя строки кода программы, за одним исключением — она выполняет код подпрограммы без захода в него, т. е. код подпрограммы выполняется полностью, и при следующем вызове команды п выполняется оператор строки кода, непосредственно следующей за строкой с вызовом подпрограммы. Таким образом, команда п позволяет «обойти» пошаговое выполнение операторов подпрограммы.
Если мы осуществляем пошаговое выполнение программы (командами s или п), то нажатие клавиши эквивалентно вызову последней команды s или п.
Если мы в процессе отладки попали в тело подпрограммы (после, например, выполнения очередной команды s), то командой г можно немедленно завершить ее выполнение. Выполнение программы приостанавливается на первом после вызова подпрограммы операторе в ожидании очередной команды пользователя.
Пошаговое выполнение программы командами s и п может оказаться утомительным делом при отладке кода большого объема. В отладчике Perl предусмотрена команда с, которая выполняет программу от текущего оператора до первой встретившейся точки останова или до завершения программы, если точки останова на соответствующем участке кода не определены.
Эта же команда позволяет выполнить программу от текущей строки до определенной строки кода программы. Для этого необходимо в вызове команды с указать номер строки, до которой должна выполниться программа, если только не встретится точка останова.
Просмотр значений переменных
В процессе отладки можно посмотреть значение любой переменной программы в любой момент времени. Команда
V [пакет [переменная]]
отображает значение заданной переменной указанного пакета. Выполненная без параметров, она отображает значения всех переменных программы из всех пакетов.
Команда t работает как переключатель, включая режим отображения строк выполняемого кода (режим трассировки) или выключая его:
Обратите внимание, что при включенном режиме трассировки отображаются все строки выполняемого кода, тогда как после его выключения, отображается только следующий, подлежащий выполнению оператор.
Точки останова и действия
В процессе отладки программы возникает необходимость приостановить ее выполнение в определенных подозрительных иестах, посмотреть значения
переменных и предпринять дальнейшие действия по отладке кода. Нам уже известна команда с отладчика, которая непрерывно выполняет код программы до первой встретившейся точки останова, но как задать ее?
Для этих целей служит команда ь (сокращение от английского глагола break — прервать) отладчика. Ее параметром является номер строки кода, в которой устанавливается точка останова: отладчик приостановит выполнение программы Perl перед заданной строкой. Если команда ь вызывается без параметра, то точка останова определяется в текущей строке.
Можно определить точку останова в первой строке кода подпрограммы. Для этого команде ь необходимо передать в качестве параметра имя подпрограммы. Например, следующая команда
устанавливает точку останова в первой строке кода подпрограммы mySub.
Иногда необходимо, чтобы выполнение программы приостанавливалось в некоторой точке программы только при выполнении каких-либо условий (например, равенства заданному числу значения какой-нибудь переменной, или совпадения значений двух других переменных и т. п.). Команда ь позволяет задавать подобные условные точки останова. Для этого ей можно передать в качестве второго параметра условие, при истинности которого точка останова будет восприниматься отладчиком как действительная точка останова. Если условие перед выполнением строки кода не будет истинно, то останова программы в этой точке не произойдет. Например, следующая команда
Команда L отображает список всех установленных точек останова, как безусловных, так и условных:
Отображаемая информация о точке останова представляет номер строки и код Perl, а также условие, при котором действует точка останова (break if (УСЛОВИЕ)). Для безусловной точки останова условие всегда истинно и равно 1.
Для удаления точки останова достаточно выполнить команду d с параметром, равным номеру строки, в которой определена точка останова. Команда о удаляет все точки останова, определенные в сеансе работы с отладчиком.
Полезно при отладке программы задать действия, которые будут предприняты перед выполнением операторов определенной строки. Например, напечатать значения каких-либо переменных или изменить их при выполнении некоторого цикла. Подобное поведение программы можно реализовать, задав действия командой а. Два ее параметра определяют строку кода и сами действия (обычный оператор Perl) перед началом выполнения операторов заданной строки:
Можно задать несколько операторов для выполняемых действий, однако следует учитывать, что это может привести к смешению отображаемой на экране монитора информации из самой программы и установленных действий.
Любое действие можно выполнить немедленно, набрав код в строке приглашения отладчика DBO. Подобные действия не изменяют текст программы (операторы действий не записываются в ее файл), но позволяют создавать новые переменные и использовать их в вычислениях. Правда, по завершении сеанса отладки подобная информация пропадает.
Мы познакомили читателя лишь с основными командами отладчика, наиболее важными и полезными, с нашей точки зрения, для процесса поиска ошибок. Их полный набор с краткими описаниями представлен в табл. 14.2. Более подробную информацию можно всегда найти в документации, с которой распространяется Perl, или из различных ресурсов Internet.
Таблица 14.2. Основные команды отладчика