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–2020 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.32.0/perlintro