Spec-Zone.ru › Perl 5.36

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API