Perl

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 21:29, 8 июня 2016.
Perl
fraimed
Парадигма мультипарадигменный: императивный, объектно-ориентированный, функциональный
Спроектировано Ларри Уолл
Печать дисциплины слабая динамическая
OS кросс-платформенный
Лицензия Artistic License или GNU GPL
Портал: www.perl.org
Влияние
Ruby, PHP, Groovy

Perl (произносится [ pɜːl ]) является языком общего назначения. Изначально он был предназначен для работы с текстом, но сейчас используется для решения широкого круга задач, включая администрирование, web-разработку, сетевое программирование, разработку графических пользовательских интерфейсов. Его основными достоинствами являются простота использования, встроенная обработка текстовых данных и наличие одной из самых впечатляющих коллекций сторонних библиотек.

История

Perl стал логическим продолжением проекта, начатого Ларри Уоллом в 1986. Из инструмента, предназначенного для конфигурации и контроля системы из шести VAX и шести SUN, расположенных на разных концах страны, Perl вырос в более универсальный продукт для системного администрирования различных платформ. Ларри Уолл по-прежнему остается его единственным архитектором. Первой операционной системой, поддерживающей работу с Perl, стала UNIX, но с тех пор к ней присоединились более 70 других, включая Windows 9x/NT/2000, MacOS, VMS, Linux, BeOS, LynxOS и QNX.

Установка

Unix и Linux

Чтобы установить Perl в Unix/Linux системе, необходимо выполнить несколько простых шагов:

  • Перейти на http://www.perl.org/get.html
  • Найти ссылку на архив с исходным кодом Perl для Unix/Linux
  • Скачать perl-5.x.y.tar.gz и выполнить в терминале следующие команды
$ tar -xzf perl-5.x.y.tar.gz
$ cd perl-5.x.y
$ ./Configure -de
$ make
$ make test
$ make install

После этого Perl будет установлен в стандартную директорию /usr/local/bin, а его библиотеки будут установлены в /usr/local/lib/perlXX, где XX - версия Perl, которую вы используете.

Windows

Вот как можно установить Perl на Windows

  • Перейти по ссылке на Strawberry Perl http://strawberryperl.com.
  • Скачать 32bit или 64bit версию инсталятора.
  • Запустить инсталятор, щелкнув по нему дважды в Windows Explorer. После этого запустится программа установки Perl.
  • Выберите стандартный способ установки и подождите, пока установка завершится.

Macitosh

Чтобы собрать свою собственную версию Perl, вам понадобится утилита 'make', которая является часть инструментов разработчика Apple, поставляемых на DVD вместе с Mac OS. Вам не понадобится последняя версия Xcode, чтобы установит make. Выполите эти простые шаги, чтобы установит Perl в Max OS X

  • Перейти на http://www.perl.org/get.html
  • Найти ссылку на архив с исходным кодом Perl для Mac OS X
  • Скачать perl-5.x.y.tar.gz и выполнить в терминале следующие команды
$ tar -xzf perl-5.x.y.tar.gz
$ cd perl-5.x.y
$ ./Configure -de
$ make
$ make test
$ make install

После этого Perl будет установлен в стандартную директорию /usr/local/bin, а его библиотеки будут установлены в /usr/local/lib/perlXX, где XX - версия Perl, которую вы используете.

Выполнение

Скрипт на Perl может быть создан в любом текстовом редакторе. Файл должен быть сохранен с расширением .pl или .PL.

#!/usr/bin/perl
# Выведет "Hello, World"
print "Hello, world\n";
$chmod 0755 hello.pl
$./hello.pl
Hello, world

Синтаксис

Комментарии

Комментарии в Perl начинаются с символа решетки и продолжаются до символа конца строки. Строки, начинающиеся с символа =pod, интерпретируются как начало секции документации (POD), и все последующие строки будут проигнорированы компилятором до тех пор, пока не встретится подстрока =cut.

# Однострочный комментарий

=pod Начало комментария
в
несколько
строк
=cut

Кавычки

Можно использовать двойные или одинарные кавычки для строковых литералов, как показано в примере ниже:

print "Hello, world\n";
print 'Hello, world\n';

Только двойные кавычки интерполируют переменные и специальные символы такие, как символ начала строки \n.

$a = 10;
print "Value of a = $a\n";   # Значение a = 10
print 'Value of a = $a\n';   # Значение a = $a\n$

Экранирующие символы

Perl использует символ обратного слеша (\) для экранирования любого типа символов, которые могут встретиться в коде.

$result = "This is \"number\"";
print "$result\n";     # This is "number"
print "\$result\n";    # $result

Идентификаторы

В Perl идентификатор это имя, используемое для идентификации переменной, функции, класса, модуля или других объектов. Имя переменной начинается с $, @ или %, далее следует любое количество букв, символов нижнего подчеркивания _ и цифр (от 0 до 9). Perl чувствителен к регистру символов. Поэтому $Manpower и $manpower это два разных идентификатора.

Типы данных

Perl является слабо типизированным языком и нет никакой необходимости в обозначении типа данных во время написания программы. Существует три основных типа данных: скаляры, массивы скаляров и хеши, также известные как ассоциативные массивы скаляров.

Скаляры

Скаляр это единица данных. Эти данные могут быть целым числом, числом с плавающей запятой, символом, строкой, параграфом или целой веб-страницей. Скалярная переменная создается с помощью символа $.

Числа

$integer = 200;
$negative = -300;
$floating = 200.340;
$bigfloat = -1.2E-23;
$octal = 0377;
$hexa = 0xff;

Строки

$var = "Скалярная строка!";
$quote = 'Строка внутри одинарных кавычек - $var';
$double = "Строка внутри двойных кавычек - $var";

Массивы

Массивы это упорядоченные списки скаляров, которые ассоциируются с числовым индексом, начиная с 0. Они создаются с помощью символа @. Чтобы обратиться к одному элементу массива, используются символ доллара $ с именем переменной,

@ages = (25, 30, 40);
@names = ("John Paul", "Lisa", "Kumar");$ages[0];    # 25
$names[2];  # Kumar

В Perl понятия List (список) и Array (массив) часто используются в качестве взаимозаменяемых. Но следует понимать, что массив - это переменная, а список - данные, которые в ней хранятся.

Создание массива

@array = (1, 2, 'Hello');
@var_10 = (1..10);
@var_abc = (a..z);
@array = qw/This is an array/;

Доступ к элементу массива

Нумерация элементов в массиве начинается с нуля. Индекс соответствует позиции элемента в массиве. С помощью отрицательного индекса можно получить элемент, начиная с конца.

@days = qw/Mon Tue Wed Thu Fri Sat Sun/;

print "$days[0]\n";    # Mon
print "$days[-1]\n";   # Sun
print "$days[-7]\n";   # Mon

Хеши

Хеш это неупорядоченный набор пар ключ/значение, к значению можно получить доступ по ключу. Хеш создатся с помощью символа процент (%).

%data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);
$data{'John Paul'} # 45

Создание хеша

%data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
%data = (-JohnPaul => 45, -Lisa => 30, -Kumar => 40);

Пример использования

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
@keys = keys %data;
# добавление элемента
$data{'Ali'} = 55;
# удаление элемента
delete $data{'Ali'};

Ссылки

Ссылка в Perl это скалярный тип данных, который хранит адрес другого значения: скаляра, массива или хеша. Поскольку ссылка является скаляром, ее можно использовать везде, где можно использовать скаляры. Можно создавать списки ссылок на другие списки, которые содержат ссылки на хеши, и так далее. Таким образом в Perl создают вложенные структуры данных.

Создание ссылки

$scalarref = \$foo;
$arrayref  = \@ARGV;
$hashref = \%ENV;
$coderef = \&handler;
$globref = \*foo;
# анонимный массив
$arrayref = [1, 2, ['a', 'b', 'c']];
# анонимный хеш
$hashref = {
     'Adam'  => 'Eve',
     'Clyde' => 'Bonnie',
};
#  анонимная подпрограмма
$coderef = sub { print "Boink!\n" };

Разыменование

Процесс разыменования включает в себя получение значения по ссылке на его адрес. Чтобы разыменовать ссылку, используют символы $, @ или % в качестве префикса в зависимости от типа переменной, на которую она указывает.

$var = 10;
$r = \$var; # $r содержит ссылку на скалярную переменную $var
$$r; # значение, находящееся по адресу $r.

Циклические ссылки

Циклические ссылки возникают, когда две ссылки содержат ссылки друг на друга. Необходимо проявлять осторожность, создавая циклические ссылки, иначе возможны утечки памяти.

my $foo = 100;
$foo = \$foo;
$$foo; # REF(0x9aae38)

If ... Else ... Unless

Условные конструкции if и unless в Perl состоят из булевого выражения и одной или более инструкций.

If / Unless

if / unless (boolean_expression 1){
 # Выполняется когда boolean_expression 1 true
}
elsif( boolean_expression 2){
 # Выполняется когда boolean_expression 2 true
}
elsif( boolean_expression 3){
 # Выполняется когда boolean_expression 3 true
}
else{
 # Executes when the none of the above condition is true
}

Switch

Конструкция switch принимает один скалярный аргумент любого типа.

use Switch;
switch(argument){
 case 1 { print "number 1" }
 case "a" { print "string a" }
 case [1..10,42] { print "number in list" }
 case (\@array) { print "number in list" }
 case /\w+/ { print "pattern" }
 case qr/\w+/ { print "pattern" }
 case (\%hash) { print "entry in hash" }
 case (\&sub) { print "arg to subroutine" }
 else { print "previous case not true" }
}

Циклы

While / Until

Цикл while в Perl повторяет выполнение тела цикла до тех пор, пока выражение для проверки имеет значение true.

while / until (condition) {
 statement(s);
}
do {
 statement(s);
}while( condition );

Цикл For

for ( init; condition; increment ){
 statement(s);
}

For each

@list = (2, 20, 30, 40, 50);
foreach $a (@list){
 print "value of a: $a\n";
}

Подпрограммы

В Perl подпрограмма или функция это набор выражений. Вы можете разбить код на множество отдельных подпрограмм на свое усмотрение, но логически разделение на фукнции делается таким образом, чтобы каждая выполняла отдельную задачу. Термины подпрограмма, метод и функция в Perl являются взаимозаменяемыми.

Использование

Можно передать в функцию переменные, которые станут доступны в теле функции с использование специального массива @_. Таким образом первый аргумент функции - $_[0], второй - $_[1] и так далее. Приватные переменные, также называемые лексическими, можно создать в любое время с помощью оператора my. Оператор local используют в основном когда текущее значение переменной должно быть видимо для вызываемых подпрограмм.

# Глобальная переменная
$string = "Hello, World!";

# Объявление функции
sub Average{
    # $variable видна только в теле Average
    my $variable;

    # Приватная переменная
    local $string;

     # Получение количества всех переданных переменных
     $n = scalar(@_);

     $sum = 0;
     foreach $item (@_){$sum += $item;}
     $average = $sum / $n;
     return $average;
}

# Вызов функции
Average(10, 20, 30);

Subroutines vs Functions vs Procedures

Читая техническую литературу и общаясь с другими разработчиками, вы можете встретиться с тремя терминами: "подпрограммы", "функции" и "процедуры". В большинстве случаев они взаимозаменяемы, но для лучшего понимая приведены точные значения.

Функция всегда возвращает значение и если передать ей одинаковые параметры, вернет одинаковые значения.

Процедура, в оличие от функции, может не возвращать вообще никакого значения и часто взаимодействует с внешним окружением через список аргументов. Например, процедура может осуществлять чтение и запись файлов.

Подпрограмма являет собой последовательность действий и может быть как функцией, так и процедурой.

ООП в Perl

Концепция объекто-ориентированного программирования в Perl во многом основана на ссылках и анонимных массивах и хешах.

Объект в Perl является сслыкой на структуру данных, которая знает, к какому классу она принаддежит. Обхект хранится как ссылка на скалярную переменную. Поскольку скаляр содержит только ссылку на объект, один и тот же скаляр может ссылаться на разные обхекты разных классов.

Класс в Perl это пакет, который содержит соответствующие методы для создания и управления объектами.

Метод в Perl это подпрограмма, определенная внутри пакета. Первый аргумент метода это ссылка на объект или имя пакета в зависимости от того, используется ли метод для текущего объекта или для всего класса объектов.

Функция bless() используется, чтобы вернуть ссылку, которая в последствие станет объектом.

package Person;

# конструктор
sub new {
    my $class = shift;
    my $self = {
        _firstName => shift,
        _lastName  => shift,
        _ssn       => shift,
    };
    bless $self, $class;
    return $self;
}

# метод
sub getFirstName {
    return $self->{_firstName};
}

# деструктор
sub DESTROY {
    print "Person::DESTROY called\n";
}

Пример использования:

use Person;
$object = new Person( "Mohammad", "Saleem", 23234345);
$firstName = $object->getFirstName();

Ссылки на источники