Spec-Zone.ru › Perl 5.34

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

Spec-Zone.ru

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