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.
Объектно-ориентированный 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.36.0/perlintro