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 и Mac OS, см. perlrun.
Защита
Perl по умолчанию очень снисходителен. Для повышения надёжности рекомендуется начинать каждую программу с следующих строк:
#!/usr/bin/perl
use strict;
use warnings; Эти две дополнительные строки запрашивают у perl перехват различных распространённых проблем в вашем коде. Они проверяют разные вещи, поэтому вам нужны обе. Возможная проблема, перехваченная use strict;, заставит ваш код немедленно остановиться при её обнаружении, в то время как use warnings; просто выдаст предупреждение (как переключатель командной строки -w) и позволит вашему коду запуститься. Чтобы узнать больше о них, ознакомьтесь с соответствующими страницами руководства в 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";Существует ряд "магических" скаляров с именами, которые похожи на пунктуацию или шумовые данные. Эти специальные переменные используются для различных целей и документированы в 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 5.10, он даже имеет оператор case/switch (написанный как given/when). Подробности см. в "Операторах Switch" в perlsyn.
Условные выражения могут быть любым выражением 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; } - Скобки для захвата
-
Помимо группировки, скобки служат ещё одной цели. Они могут использоваться для захвата результатов частей совпадения с регулярным выражением для последующего использования. Результаты попадают в
$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"; } - Другие возможности регулярных выражений
-
Регулярные выражения 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.
Объектно-ориентированный Perl
Объектно-ориентированный Perl относительно прост и реализован с использованием ссылок, которые знают, какой тип объекта они представляют, основываясь на концепции пакетов Perl. Однако объектно-ориентированный Perl в значительной степени выходит за рамки этого документа. Прочитайте perlootut и perlobj.
В качестве начинающего программиста Perl, вы чаще всего будете использовать объектно-ориентированный Perl при использовании модулей сторонних разработчиков, которые описаны ниже.
Использование модулей Perl
Модули Perl предоставляют ряд функций, помогающих избежать повторного изобретения велосипеда, и их можно загрузить с CPAN ( http://www.cpan.org/ ). Многие популярные модули поставляются с самим Perl.
Категории модулей варьируются от обработки текста до сетевых протоколов, интеграции с базами данных и графики. На CPAN также доступен категоризированный список модулей.
Чтобы узнать, как устанавливать модули, загруженные с CPAN, прочитайте perlmodinstall.
Чтобы узнать, как использовать конкретный модуль, воспользуйтесь perldoc Module::Name. Обычно вы захотите use Module::Name, что даст вам доступ к экспортированным функциям или объектно-ориентированному интерфейсу модуля.
perlfaq содержит вопросы и ответы по многим распространённым задачам и часто предлагает рекомендации по хорошим модулям CPAN.
perlmod описывает модули Perl в целом. perlmodlib перечисляет модули, которые поставлялись с вашей установкой Perl.
Если вы почувствуете желание написать модули Perl, perlnewmod предоставит вам полезные советы.
АВТОР
Kirrily "Skud" Robert <skud@cpan.org>
© 1993–2021 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.34.0/perlintro