perlintro
СОДЕРЖАНИЕ
- НАЗВАНИЕ
- ОПИСАНИЕ
- Что такое Perl?
- Запуск программ Perl
- Система безопасности
- Обзор базового синтаксиса
- Типы переменных Perl
- Область действия переменных
- Условные и циклические конструкции
- Встроенные операторы и функции
- Файлы и ввод/вывод
- Регулярные выражения
- Написание подпрограмм
- Объектно-ориентированный Perl
- Использование модулей Perl
- АВТОР
НАЗВАНИЕ
perlintro - краткое введение и обзор Perl
ОПИСАНИЕ
Этот документ предназначен для быстрого обзора языка программирования Perl, а также указания на дополнительные документы. Он предназначен в качестве руководства для начинающих программистов и содержит достаточно информации, чтобы вы могли прочитать код Perl других людей и понять, что он делает, или написать свои собственные простые скрипты.
Этот вводный документ не претендует на полноту. Он даже не претендует на полную точность. В некоторых случаях совершенство было принесено в жертву ради достижения общей идеи. Вам настоятельно рекомендуется дополнить это введение более подробной информацией из полного руководства Perl, оглавление которого можно найти в perltoc.
На протяжении всего этого документа вы найдете ссылки на другие части документации Perl. Вы можете прочитать эту документацию, используя команду perldoc или любой другой способ, которым вы читаете этот документ.
В документации Perl вы найдете многочисленные примеры, предназначенные для пояснения обсуждаемых функций. Пожалуйста, имейте в виду, что многие из них представляют собой фрагменты кода, а не полные программы.
Эти примеры часто отражают стиль и предпочтения автора той или иной части документации и могут быть короче, чем соответствующая строка кода в реальной программе. За исключением случаев, когда указано иначе, вы должны предполагать, что операторы use strict и use warnings появляются ранее в «программе», и что любые используемые переменные уже объявлены, даже если эти объявления опущены для упрощения чтения примера.
Обратите внимание, что примеры были написаны многими разными авторами в течение нескольких десятилетий. Поэтому стили и техники могут отличаться, хотя были предприняты усилия, чтобы не слишком сильно различаться в одних и тех же разделах. Не считайте один стиль лучше других - «Есть более чем один способ сделать это» - один из девизов Perl. В конце концов, в вашем путешествии программиста вы, скорее всего, столкнетесь с разными стилями.
Что такое Perl?
Perl - язык программирования общего назначения, первоначально разработанный для обработки текста и теперь используемый для широкого круга задач, включая администрирование систем, разработку веб-приложений, сетевое программирование, разработку графических интерфейсов и многое другое.
Язык предназначен быть практичным (легким в использовании, эффективным, полным), а не красивым (крошечным, изящным, минимальным). Его основные особенности: легкость в использовании, поддержка процедурного и объектно-ориентированного (ОО) программирования, мощная встроенная поддержка обработки текста и одна из самых впечатляющих в мире коллекций модулей сторонних разработчиков.
Различные определения Perl даны в perl, perlfaq1 и, без сомнения, в других местах. Из этого мы можем определить, что Perl - это разные вещи для разных людей, но многие люди считают, что это, по крайней мере, стоит обсуждения.
Запуск программ Perl
Чтобы запустить программу Perl из командной строки Unix:
perl progname.pl В качестве альтернативы, поместите это в первую строку вашего скрипта:
#!/usr/bin/env perl ... и запустите скрипт как /path/to/script.pl. Конечно, сначала необходимо сделать его исполняемым, поэтому chmod 755 script.pl (в Unix).
(Эта начальная строка предполагает, что у вас есть программа env. Вы также можете ввести непосредственно путь к вашему исполняемому файлу perl, как в #!/usr/bin/perl).
Для получения дополнительной информации, включая инструкции для других платформ, таких как Windows, см. perlrun.
Система безопасности
Perl по умолчанию очень снисходителен. Чтобы повысить его надежность, рекомендуется начинать каждую программу со следующих строк:
#!/usr/bin/perl
use strict;
use warnings; Две дополнительные строки запрашивают от Perl перехват различных распространённых проблем в вашем коде. Они проверяют разные вещи, поэтому вам нужны обе. Потенциальная проблема, пойманная use strict;, заставит ваш код остановиться немедленно при её обнаружении, в то время как use warnings; просто выдаст предупреждение (как флаг командной строки -w) и позволит вашему коду работать дальше. Чтобы узнать больше о них, обратитесь к соответствующим страницам руководства по strict и warnings.
Декларация use v5.35 (или выше) включит как strict, так и warnings.
#!/usr/bin/perl
use v5.35; В дополнение к включению прагм strict и warnings, данное объявление также активирует "пакет функций"; коллекцию именованных функций, которые включают в себя многие из последних добавлений и изменений языка, а также иногда удаляют устаревшие функции, которые считаются ошибками проектирования и не рекомендуется их использовать.
Обзор базового синтаксиса
Скрипт или программа Perl состоит из одной или нескольких инструкций. Эти инструкции просто записываются в скрипте в простой форме. Нет необходимости в функции main() или чем-то подобном.
Инструкции Perl заканчиваются точкой с запятой:
print "Hello, world"; Комментарии начинаются с символа решётки и продолжаются до конца строки
# This is a comment Пробелы не имеют значения:
print
"Hello, world"
; ... за исключением строковых литералов:
# this would print with a linebreak in the middle
print "Hello
world"; В качестве разделителей строковых литералов можно использовать двойные кавычки или одинарные кавычки:
print "Hello, world";
print 'Hello, world'; Однако только двойные кавычки «интерполируют» переменные и специальные символы, такие как новые строки (\n):
print "Hello, $name\n"; # works fine
print 'Hello, $name\n'; # prints $name\n literally Числа не требуют кавычек вокруг них:
print 42; Вы можете использовать скобки для аргументов функций или опустить их по своему желанию. Они необходимы только в тех случаях, когда необходимо прояснить вопросы приоритета.
print("Hello, world\n");
print "Hello, world\n"; Более подробную информацию о синтаксисе Perl можно найти в perlsyn.
Типы переменных Perl
Perl имеет три основных типа переменных: скаляры, массивы и хеши.
- Скаляры
-
Скаляр представляет собой единственное значение:
my $animal = "camel"; my $answer = 42;Скалярные значения могут быть строками, целыми числами или числами с плавающей запятой, и Perl автоматически преобразует их по мере необходимости. Вы должны объявлять их с помощью ключевого слова
my, когда вы их впервые используете. (Это одно из требованийuse strict;.)Скалярные значения могут использоваться различными способами:
print $animal; print "The animal is $animal\n"; print "The square of $answer is ", $answer * $answer, "\n";Perl определяет ряд специальных скаляров с короткими именами, часто в виде одиночных знаков препинания или цифр. Эти переменные используются для самых разных целей и документированы в perlvar. Единственная, о которой вам нужно знать сейчас, это
$_, которая является «переменной по умолчанию». Она используется в качестве аргумента по умолчанию для ряда функций в Perl и неявно устанавливается некоторыми циклическими конструкциями.print; # prints contents of $_ by default - Массивы
-
Массив представляет собой список значений:
my @animals = ("camel", "llama", "owl"); my @numbers = (23, 42, 69); my @mixed = ("camel", 42, 1.23);Массивы нумеруются с нуля. Вот как получить элементы в массиве:
print $animals[0]; # prints "camel" print $animals[1]; # prints "llama"Специальная переменная
$#arrayпоказывает индекс последнего элемента массива:print $mixed[$#mixed]; # last element, prints 1.23Вы можете быть искушены использовать
$#array + 1, чтобы узнать, сколько элементов содержится в массиве. Не беспокойтесь об этом. Как видите, использование@array, где Perl ожидает найти скалярное значение («в скалярном контексте»), даст вам количество элементов в массиве:if (@animals < 5) { ... }Элементы, которые мы получаем из массива, начинаются с
$, потому что мы получаем только одно значение из массива; вы запрашиваете скаляр, вы получаете скаляр.Чтобы получить несколько значений из массива:
@animals[0,1]; # gives ("camel", "llama"); @animals[0..2]; # gives ("camel", "llama", "owl"); @animals[1..$#animals]; # gives all except the first elementЭто называется «срез массива».
Вы можете выполнять различные полезные действия со списками:
my @sorted = sort @animals; my @backwards = reverse @numbers;Существует также несколько специальных массивов, таких как
@ARGV(аргументы командной строки для вашего скрипта) и@_(аргументы, передаваемые подпрограмме). Они документированы в perlvar. - Хеши
-
Хеш представляет собой набор пар «ключ-значение»:
my %fruit_color = ("apple", "red", "banana", "yellow");Вы можете использовать пробелы и оператор
=>, чтобы расположить их более красиво:my %fruit_color = ( apple => "red", banana => "yellow", );Чтобы получить элементы хеша:
$fruit_color{"apple"}; # gives "red"Вы можете получить списки ключей и значений с помощью
keys()иvalues().my @fruits = keys %fruit_color; my @colors = values %fruit_color;Хеши не имеют определённого внутреннего порядка, хотя вы можете отсортировать ключи и пройти по ним.
Как и у специальных скаляров и массивов, существуют также специальные хеши. Наиболее известный из них -
%ENV, который содержит переменные среды. Прочитайте обо всём этом (и других специальных переменных) в perlvar.
Скаляры, массивы и хеши более подробно описаны в perldata.
Более сложные типы данных можно создавать с помощью ссылок, которые позволяют вам создавать списки и хеши внутри списков и хешей.
Ссылка — это скалярное значение и может ссылаться на любой другой тип данных Perl. Таким образом, храня ссылку как значение элемента массива или хеша, вы можете легко создавать списки и хеши внутри списков и хешей. Следующий пример показывает двухуровневую структуру хеша хеша, использующую анонимные ссылки на хеши.
my $variables = {
scalar => {
description => "single item",
sigil => '$',
},
array => {
description => "ordered list of items",
sigil => '@',
},
hash => {
description => "key/value pairs",
sigil => '%',
},
};
print "Scalars begin with a $variables->{'scalar'}->{'sigil'}\n"; Подробная информация по теме ссылок доступна в perlreftut, perllol, perlref и perldsc.
Область действия переменных
На протяжении всего предыдущего раздела все примеры использовали синтаксис:
my $var = "value"; Ключевое слово my на самом деле не требуется; вы можете просто использовать:
$var = "value"; Однако, использование вышеуказанного способа создаст глобальные переменные во всей вашей программе, что является плохой программистской практикой. my создаёт переменные с лексической областью видимости вместо этого. Переменные ограничены блоком (т. е. группой инструкций, окружённых фигурными скобками), в котором они определены.
my $x = "foo";
my $some_condition = 1;
if ($some_condition) {
my $y = "bar";
print $x; # prints "foo"
print $y; # prints "bar"
}
print $x; # prints "foo"
print $y; # prints nothing; $y has fallen out of scope Использование my в сочетании с use strict; в начале ваших скриптов Perl означает, что интерпретатор обнаружит некоторые распространённые ошибки программирования. Например, в приведённом выше примере окончательное print $y вызовет ошибку во время компиляции и предотвратит выполнение программы. Использование strict настоятельно рекомендуется.
Условные и циклические конструкции
Perl имеет большинство стандартных условных и циклических конструкций.
Условием может быть любое выражение Perl. Список операторов в следующем разделе содержит информацию о операторах сравнения и булевых операциях, которые обычно используются в условных операторах.
- if
-
if ( condition ) { ... } elsif ( other condition ) { ... } else { ... }Также есть отрицающая версия:
unless ( condition ) { ... }Это представлено как более читабельная версия
if (!condition).Обратите внимание, что фигурные скобки требуются в Perl, даже если в блоке всего одна строка. Однако есть хитрый способ сделать ваши однострочные условные блоки более похожими на английский:
# the traditional way if ($zippy) { print "Yow!"; } # the Perlish post-condition way print "Yow!" if $zippy; print "We have no bananas" unless $bananas; - while
-
while ( condition ) { ... }Также есть отрицающая версия по той же причине, что у нас есть
unless:until ( condition ) { ... }Вы также можете использовать
whileв пост-условии:print "LA LA LA\n" while 1; # loops forever - for
-
Точно так же, как в C:
for ($i = 0; $i <= $max; $i++) { ... }Стиль цикла for в стиле C редко используется в Perl, так как Perl предоставляет более удобный цикл сканирования списка
foreach. - foreach
-
foreach (@array) { print "This element is $_\n"; } print $list[$_] foreach 0 .. $max; # you don't have to use the default $_ either... foreach my $key (keys %hash) { print "The value of $key is $hash{$key}\n"; }Ключевое слово
foreachфактически является синонимом ключевого словаfor. См."Foreach Loops" in perlsyn.
Для более подробной информации о циклических конструкциях (и некоторых, которые не были упомянуты в этом обзоре), обратитесь к perlsyn.
Встроенные операторы и функции
Perl поставляется с широким выбором встроенных функций. Некоторые из тех, что мы уже видели, включают print, sort и reverse. Список этих функций приведён в начале perlfunc, и вы легко можете узнать о любой данной функции, используя perldoc -f functionname.
Операторы Perl подробно документированы в perlop, но вот несколько наиболее распространённых:
- Арифметика
-
+ addition - subtraction * multiplication / division - Сравнение чисел
-
== equality != inequality < less than > greater than <= less than or equal >= greater than or equal - Сравнение строк
-
eq equality ne inequality lt less than gt greater than le less than or equal ge greater than or equal(Почему у нас есть отдельные числовые и строковые сравнения? Потому что у нас нет специальных типов переменных, и Perl должен знать, следует ли сортировать по числовому значению (где 99 меньше 100) или по алфавиту (где 100 предшествует 99)).
- Булева логика
-
&& and || or ! not(
and,orиnotне только представлены в таблице выше в качестве описаний операторов. Они также поддерживаются как самостоятельные операторы. Они более читабельны, чем операторы в стиле C, но имеют другую приоритетность по отношению к&&и подобным. Для получения более подробной информации обратитесь к perlop). - Разное
-
= assignment . string concatenation x string multiplication (repeats strings) .. range operator (creates a list of numbers or strings)
Многие операторы можно комбинировать с = следующим образом:
$a += 1; # same as $a = $a + 1
$a -= 1; # same as $a = $a - 1
$a .= "\n"; # same as $a = $a . "\n"; Файлы и ввод/вывод
Вы можете открыть файл для ввода или вывода с помощью функции open(). Она подробно описана в perlfunc и perlopentut, но кратко:
open(my $in, "<", "input.txt") or die "Can't open input.txt: $!";
open(my $out, ">", "output.txt") or die "Can't open output.txt: $!";
open(my $log, ">>", "my.log") or die "Can't open my.log: $!"; Вы можете читать из открытого файла с помощью оператора <>. В скалярном контексте он считывает одну строку из файла, а в списочном контексте он считывает весь файл целиком, присваивая каждую строку элементу списка:
my $line = <$in>;
my @lines = <$in>; Чтение всего файла за один раз называется «заглатывание». Это может быть полезно, но может занимать много памяти. Большинство задач обработки текстовых файлов можно выполнить построчно с помощью циклических конструкций Perl.
Оператор <> чаще всего используется в цикле while:
while (<$in>) { # assigns each line in turn to $_
print "Just read in this line: $_";
} Мы уже видели, как печатать на стандартный вывод с помощью print(). Однако print() также может принимать необязательный первый аргумент, определяющий, в какой файл-дескриптор печатать:
print STDERR "This is your final warning.\n";
print $out $record;
print $log $logmessage; Когда вы закончите работу с файловыми дескрипторами, вы должны close() их (хотя, честно говоря, Perl всё равно уберёт за вами, если вы забудете):
close $in or die "$in: $!"; Регулярные выражения
Поддержка регулярных выражений в Perl одновременно широка и глубока и является предметом обширной документации в perlrequick, perlretut и других документах. Однако коротко:
- Простое сопоставление
-
if (/foo/) { ... } # true if $_ contains "foo" if ($a =~ /foo/) { ... } # true if $a contains "foo"Оператор сопоставления
//документирован в perlop. Он по умолчанию работает со$_, или может быть привязан к другой переменной с помощью оператора привязки=~(также документирован в perlop). - Простое подстановка
-
s/foo/bar/; # replaces foo with bar in $_ $a =~ s/foo/bar/; # replaces foo with bar in $a $a =~ s/foo/bar/g; # replaces ALL INSTANCES of foo with bar # in $aОператор подстановки
s///документирован в perlop. - Более сложные регулярные выражения
-
Вам не просто нужно сопоставлять фиксированные строки. Фактически, вы можете сопоставлять практически что угодно, что вы можете себе представить, используя более сложные регулярные выражения. Они подробно описаны в perlre, но пока вот быстрый справочник:
. a single character \s a whitespace character (space, tab, newline, ...) \S non-whitespace character \d a digit (0-9) \D a non-digit \w a word character (a-z, A-Z, 0-9, _) \W a non-word character [aeiou] matches a single character in the given set [^aeiou] matches a single character outside the given set (foo|bar|baz) matches any of the alternatives specified ^ start of string $ end of stringКвантификаторы могут использоваться для указания того, сколько предыдущих элементов вы хотите сопоставить, где «элемент» означает либо буквенный символ, один из метасимволов, перечисленных выше, или группу символов или метасимволов в скобках.
* zero or more of the previous thing + one or more of the previous thing ? zero or one of the previous thing {3} matches exactly 3 of the previous thing {3,6} matches between 3 and 6 of the previous thing {3,} matches 3 or more of the previous thingНекоторые краткие примеры:
/^\d+/ string starts with one or more digits /^$/ nothing in the string (start and end are adjacent) /(\d\s){3}/ three digits, each followed by a whitespace character (eg "3 4 5 ") /(a.)+/ matches a string in which every odd-numbered letter is a (eg "abacadaf") # This loop reads from STDIN, and prints non-blank lines: while (<>) { next if /^$/; print; } - Скобки для захвата
-
Помимо группировки, скобки выполняют вторую функцию. Они могут использоваться для захвата результатов частей совпадения regexp для последующего использования. Результаты попадают в
$1,$2и так далее.# a cheap and nasty way to break an email address up into parts if ($email =~ /([^@]+)@(.+)/) { print "Username is $1\n"; print "Hostname is $2\n"; } - Другие особенности regexp
-
Регулярные выражения Perl также поддерживают обратные ссылки, предпроверки и другие сложные детали. Подробнее об этом читайте в perlrequick, perlretut и perlre.
Написание подпрограмм
Написание подпрограмм просто:
sub logger {
my $logmessage = shift;
open my $logfile, ">>", "my.log" or die "Could not open my.log: $!";
print $logfile $logmessage;
} Теперь мы можем использовать подпрограмму так же, как любую другую встроенную функцию:
logger("We have a logger subroutine!"); Что это такое shift? Ну, аргументы подпрограммы доступны нам в виде специального массива под названием @_ (см. perlvar для получения дополнительной информации об этом). По умолчанию аргумент функции shift равен @_. Поэтому my $logmessage = shift; извлекает первый элемент из списка аргументов и присваивает его $logmessage.
Мы можем манипулировать @_ и другими способами:
my ($logmessage, $priority) = @_; # common
my $logmessage = $_[0]; # uncommon, and ugly Подпрограммы также могут возвращать значения:
sub square {
my $num = shift;
my $result = $num * $num;
return $result;
} И затем использовать её так:
$sq = square(8); Для получения более подробной информации о написании подпрограмм, обратитесь к perlsub.
OO Perl
OO Perl относительно прост и реализован с использованием ссылок, которые знают, какой тип объекта они представляют, на основе концепции пакетов Perl. Однако OO Perl в основном выходит за рамки этого документа. Прочитайте perlootut и perlobj.
Как начинающий программист Perl, вы чаще всего будете использовать OO Perl для использования модулей сторонних разработчиков, которые документированы ниже.
Использование модулей Perl
Модули Perl предоставляют ряд функций, чтобы помочь вам избежать повторного изобретения велосипеда, и их можно загрузить из CPAN ( http://www.cpan.org/ ). Ряд популярных модулей включены в саму дистрибуцию Perl.
Категории модулей варьируются от обработки текста до сетевых протоколов, интеграции с базами данных и графики. Классифицированный список модулей также доступен на CPAN.
Чтобы узнать, как установить модули, загруженные с CPAN, прочитайте perlmodinstall.
Чтобы узнать, как использовать конкретный модуль, используйте perldoc Module::Name. Обычно вам нужно будет use Module::Name, чтобы получить доступ к экспортированным функциям или интерфейсу OO модуля.
perlfaq содержит вопросы и ответы по многим распространённым задачам и часто предлагает рекомендации по использованию хороших модулей CPAN.
perlmod описывает модули Perl в целом. perlmodlib перечисляет модули, которые поставлялись с вашей установкой Perl.
Если вы почувствуете желание написать модули Perl, perlnewmod предоставит вам ценные советы.
АВТОР
Kirrily "Skud" Robert <skud@cpan.org>
© 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/perlintro