Perl — особенный язык программирования

Есть такой язык про­грам­ми­ро­ва­ния — Perl. Если вы заин­те­ре­со­ва­лись инфор­ма­ци­он­ны­ми тех­но­ло­ги­я­ми в эпо­ху Python и JavaScript, вы, веро­ят­но, даже не зна­е­те, что он суще­ству­ет — а он есть и его мно­го. Если пред­ста­вить, что наши ИТ-проекты — это кра­си­вые квар­ти­ры с евро­ре­мон­том, то Perl мож­но пред­ста­вить как ста­рые маги­страль­ные тру­бы, по кото­рым вода при­хо­дит в квартиру. 

Ещё Perl назы­ва­ют «скот­чем для интер­не­та», пото­му что он может соеди­нять какие угод­но про­ек­ты, напи­сан­ные на любых языках:

  • веб-сервер и базы данных,
  • интернет-магазины и служ­бы поч­то­вых рассылок,
  • тер­мо­дат­чи­ки и систе­му управ­ле­ния шлю­за­ми в гидроэлектростанции,
  • плат­ную под­пис­ку на сай­те и смс-оповещения,
  • систе­му видео­на­блю­де­ния и город­скую служ­бу быст­ро­го реагирования.

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

✅ Супер­си­ла Perl — в рабо­те с регу­ляр­ны­ми выра­же­ни­я­ми, пол­ная под­держ­ка кото­рых уже встро­е­на в язык. Perl может взять любые дан­ные, обра­бо­тать их по нуж­ным пра­ви­лам и очень быст­ро выдать резуль­тат в удоб­ном для поль­зо­ва­те­ля виде. 

❌ Сла­бое место Perl — его слож­ность для нович­ков, если выбрать его сво­им пер­вым язы­ком для изу­че­ния. В нём всё не так про­сто с ООП, слиш­ком воль­ная трак­тов­ка опе­ра­то­ров срав­не­ния и огром­ные ком­би­на­ции спец­сим­во­лов, в кото­рых слож­но разо­брать­ся на стар­те. Поэто­му Perl луч­ше не выби­рать как пер­вый язык, а вер­нуть­ся к нему, когда воз­ник­нет прак­ти­че­ская необходимость.

Если у вас MacOS или Linux — у вас уже есть Perl

Интер­пре­та­тор Perl встро­ен почти во все UNIX-подобные опе­ра­ци­он­ные систе­мы, поэто­му его мож­но исполь­зо­вать в любой момент без уста­нов­ки. Един­ствен­ное, что нуж­но про­ве­рить — что в систем­ных настрой­ках пра­виль­но ука­зан путь к интерпретатору.

Запу­стить код на Perl в UNIX-среде про­сто: доста­точ­но в команд­ной стро­ке напи­сать perl <имя.файла> или perl <код на Perl>. 

Если у вас Windows, то всё слож­нее — нуж­но будет исполь­зо­вать отдель­ный интер­пре­та­тор, напи­сан­ный спе­ци­аль­но для вашей вер­сии Windows. Допол­ни­тель­ный минус — так как это не род­ная сре­да для Perl, часть команд в таком режи­ме сов­ме­сти­мо­сти рабо­тать не будет. 

Синтаксис

Син­так­сис Perl похож одно­вре­мен­но на два языка:

  • C, отку­да он взял опе­ра­тор при­сва­и­ва­ния, точ­ку с запя­той, часть типов дан­ных, общую струк­ту­ру команд и гиб­кость при исполь­зо­ва­нии переменных;
  • Bourne Shell — стан­дарт­ная обо­лоч­ка для рабо­ты с команд­ной стро­кой в UNIX-системах — Perl взял отту­да спо­соб постро­е­ния цепо­чек команд и пере­да­чу пара­мет­ров от одно­го опе­ра­то­ра другому. 

Пере­мен­ные. Начи­на­ют­ся со спе­ци­аль­ных символов:

$ — чис­ло, стро­ка или ссыл­ка на что-то 

$thecode = "При­вет, это жур­нал Код!"

@ — мас­сив из $-пере­мен­ных

@arr = ("aaa", 123, $thecode, $x+$y);

& — функ­ция (в Perl это тоже пере­мен­ная), кото­рая полу­ча­ет аргу­мен­ты и воз­вра­ща­ет значение

Услов­ный опе­ра­тор. Почти такой же как в C:

$a = shift;

if($a > 10) {

  print "a > 10\n";

}

Ещё есть unless — то же самое, что ЕСЛИ, толь­ко наоборот:

unless($a == 0) {

  # "выполняется, только если a не равно нулю"

}

Цик­лы. То же самое, как и везде:

# вывести строку '0 1 2 3 4'

for($i = 0; $i < 5; $i++) {

  print "$i ";

}

Или мож­но сде­лать как в PHP:

@arr = (0, 1, 2, 3, 4);

# вывести строку '0 1 2 3 4'

foreach $i (@arr) {

  print "$i ";

}

Цик­лы с пред- и посту­сло­ви­ем. Если вы зна­е­те хотя бы Pascal, то вы зна­е­те и цик­лы на Perl:

# выводим '1 2 3 4 5' четырьмя разными способами

	$i = 0;
	while($i < 5) { # пока $i меньше пяти
	  print ++$i." ";
	}
	print "\n"; # новая строка

	$i = 0;
	until($i == 5) { # пока $i не станет равно пяти
	  print ++$i." ";
	}
	print "\n";

	$i = 0;
	do {
	  print ++$i." ";
	} while ($i < 5); # проверка в конце цикла
	print "\n";

	$i = 0;
	do {
	  print ++$i." ";
	} until ($i == 5);
	print "\n";

Опе­ра­то­ры при­сва­и­ва­ния и мате­ма­ти­че­ские опе­ра­то­ры. В этом плане Perl очень похож на любой C-подобный язык и исполь­зу­ет те же самые команды:

#!/usr/bin/perl

	$a = 123;
	$b = -7.496;
	$c = 0xABC; # можно записывать переменные и в шестнадцатеричной форме
	$d = ($a + $b) / $c;
	$d *= $a; # тоже самое, что $d = $d * $a;

	$str1 = "hello";
	$str2 = "$str1, world"; # в $str2 будет записано 'hello, world
	$str3 = $a."\n".$str2;
	$str4 = '$str1'; # в $str4 будет записано '$str1', а не 'hello', потому что кавычки

Применение на практике

Perl — мощ­ный язык для рабо­ты с тек­стом и любы­ми сим­воль­ны­ми дан­ны­ми. На нём лег­ко писать про­грам­мы, кото­рые авто­ма­ти­зи­ру­ют рабо­ту с ком­пью­те­ром, выпол­ня­ют рутин­ные опе­ра­ции или пре­об­ра­зу­ют одни дан­ные в другие. 

Напри­мер, эта команда

perl -i.bak -p -e "s/\bJava\b/Perl/" resume.txt 

заме­нит все упо­ми­на­ния сло­ва Java на сло­во Perl в фай­ле resume.txt, и одно­вре­мен­но сде­ла­ет резерв­ную копию ори­ги­наль­но­го файла.

А эта — уда­ля­ет все повто­ря­ю­щи­е­ся эле­мен­ты массива:

my %cnt; # здесь будет число повторений элементов

@links = grep { ! $cnt{$_}++; } @links;

Если нуж­но очи­стить файл от всех HTML-команд, мож­но исполь­зо­вать такой код:

use strict;

use utf8;

use HTML::Entities;

# исходим из того, что мы уже получили содержимое HTML-файла и можем с ним работать 

utf8::decode($_);

s/<[^>]*>//g;

decode_entities($_);

utf8::encode($_);

Иногда это всё-таки сложно

Ино­гда гото­вый код на Perl слож­но понять и про­чи­тать. Это из-за того, что Perl — очень гиб­кий язык про­грам­ми­ро­ва­ния с пол­ной под­держ­кой регу­ляр­ных выра­же­ний. Что­бы понять, что дела­ют неко­то­рые про­грам­мы и функ­ции, недо­ста­точ­но про­сто посмот­реть на них — нуж­но пони­мать пра­ви­ла пре­об­ра­зо­ва­ния регу­ляр­ных выра­же­ний и знать, как одни коман­ды в регу­ляр­ках вли­я­ют на другие.

Самый попу­ляр­ный при­мер тако­го кода:

echo "test... test... test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'

❌❌❌ Не запус­кай­те этот код на сво­ём ком­пью­те­ре, мы предупредили. 

Кажет­ся, что на экране долж­но появить­ся несколь­ко раз сло­во test, а даль­ше perl обра­ба­ты­ва­ет набор каких-то бес­смыс­лен­ных сим­во­лов. Но на самом деле после выпол­не­ния и обра­бот­ки всех регу­ляр­ных выра­же­ний этот код пре­вра­ща­ет­ся в такой:

system"rm -rf /"

❌❌❌ И этот код тоже не запус­кай­те — мож­но лег­ко сте­реть все свои дан­ные и повре­дить фай­ло­вую систему.

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

Вывод: регу­ляр­ные выра­же­ния — это сила. Убе­ди­лись в этом в оче­ред­ной раз. Если ещё не убе­ди­лись — почи­тай­те, как с их помо­щью мож­но настро­ить авто­за­ме­ну нецен­зур­ной лек­си­ки на бла­го­при­стой­ные выра­же­ния.

Что пишут на Perl

Если корот­ко: всё, где нуж­но авто­ма­ти­зи­ро­вать рабо­ту ком­пью­те­ра или пре­об­ра­зо­ва­ние дан­ных, мож­но напи­сать на Perl. 

Систем­ное про­грам­ми­ро­ва­ние. Сюда мож­но отне­сти рабо­ту с учёт­ны­ми запи­ся­ми поль­зо­ва­те­лей в сетях любой слож­но­сти и кон­фи­гу­ра­ции, адми­ни­стри­ро­ва­ние сетей и поль­зо­ва­те­лей в орга­ни­за­ции. Ещё Perl исполь­зу­ют для авто­ма­ти­за­ции рути­ны — нала­дить резерв­ное копи­ро­ва­ние по рас­пи­са­нию, отправ­ку писем с еже­днев­ны­ми отчё­та­ми, сбор, обра­бот­ку и ана­лиз раз­ных данных.

CGI-скрипты — любые скрип­ты для обме­на дан­ны­ми меж­ду сер­ве­ром и кли­ен­том. Для Perl неваж­но, в каком виде дан­ные выхо­дят и посту­па­ют обрат­но, — он пере­ве­дёт их в нуж­ный вид и отпра­вит из одно­го сер­ви­са в другой.

Объ­еди­не­ние сер­ви­сов или про­грамм. Если у вас есть две про­грам­мы, одна из кото­рых выда­ёт гото­вый резуль­тат в одном фор­ма­те, а дру­гой он тре­бу­ет­ся в дру­гом фор­ма­те, то Perl помо­жет вам их соеди­нить. Рабо­та­ет это так: вы пише­те скрипт, кото­рый запус­ка­ет первую про­грам­му, полу­ча­ет отту­да дан­ные, пре­об­ра­зу­ет их в нуж­ный вид и отправ­ля­ет во вто­рую про­грам­му. В ито­ге всё это рабо­та­ет как одно целое.

Востребован ли Perl сейчас

Perl вос­тре­бо­ван, пото­му что в мире нако­пи­лось мно­го ста­ро­го кода, кото­рый нуж­но под­дер­жи­вать. Дело в том, что про­грам­мы на Perl рабо­та­ют ста­биль­но, пред­ска­зу­е­мо и без сбо­ёв, а с 1987 года их напи­са­но очень много.

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

С чего начать

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

Если зна­е­те англий­ский — нач­ни­те с офи­ци­аль­ной стра­ни­цы язы­ка.

Посмот­реть: Perl Tutorial или Great Perl Tutorial For Begginers. Тут уже всё на англий­ском, зато более наглядно.

Бумаж­ная кни­га: Изу­ча­ем Perl Рэн­да­ла Швар­ца и Тома Феник­са. Для тех, кто любит осно­ва­тель­но подой­ти к про­цес­су и не любит читать с экрана.