Вопрос 5. Назначение и основные возможности языка Perl , пример программы


Добавил:DMT
Дата создания:30 декабря 2007, 19:16
Дата обновления:30 декабря 2007, 19:16
Просмотров:10160 последний вчера, 0:51
Комментариев: 1
Вопрос 5. Назначение и основные возможности языка Perl , пример программы
up

Комментарии для "Вопрос 5. Назначение и основные возможности языка Perl , пример программы"


Пользователь: doriangray_rus
Сообщений: 13
Статус: Незримый
Зарегистрирован:
6 января 2008, 18:12
Был:21 января 2008, 0:29
doriangray_rus
smsup
Дата: 11 января 2008, 23:33 Сообщение № 1
Perl (/pɜːɹl/, «пёрл»; в русском языке устоялось «перл») — язык программирования. Создатель Ларри Уолл. Само слово Perl — аббревиатура, которая расшифровывается как Practical Extraction and Report Language (практический язык извлечений и отчётов, отчего сначала язык назывался PEARL, но затем буква «A» «потерялась»). Существует также ряд других вариантов. Согласно самому красивому из них, название perl произошло от слова pearl (жемчужина). Талисманом языка Perl является верблюд — не слишком
красивое, но очень выносливое животное, способное выполнять тяжёлую работу.

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

Perl также знаменит огромной коллекцией дополнительных модулей CPAN, находящейся по адресу http://www.cpan.org(англ.)

Интересен текст на Perl, печатающий простые числа:
perl -wle '(1 x $_) !~ /^(11+)\1+$/ && print while ++ $_'

Еще один также впечатляющий своей краткостью пример, имеющий к тому же практическую пользу. Печатаются только уникальные строки файла file.
perl -ne '$s{$_}++ || print' file

В этих примерах Perl напоминает своей краткостью и непонятностью с первого взгляда язык J.

Перл унаследовал много свойств от языков Си, shell script, awk.

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

С 2000 года идет разработка новой (6-ой) версии языка. В отличие от предыдущих версий, разработчики планируют создать четко определенный стандарт языка. В настоящее время существуют экспериментальные компиляторы Perl 6, но продолжается дальнейшая дискуссия о новых правилах. На русском языке информация о новой версии языка доступна на сайте http://perl6.ru/.
Perl — далеко не единственный язык, дающий богатые возможности в обработке текста. Языки программирования Icon и Snobol предоставляют возможность использовать более полно метод программирования «сопоставления с образцом», частным случаем которого и являются регулярные выражения.

Существует также полноценный shell, использующий в качестве основы язык Perl. Называется он psh и даёт возможность смешивать команды обычного шелла и самого Perl’а.

Синтаксис языка Perl
Синтаксис Perl имеет много общего с синтаксисом языков Си, Awk, sed и shell.

Первая строка исходного кода должна начинаться с "#!/Путь/к/Perl [-ключи]" - что указывает системе путь к интерпретатору Perl для выполнения программы в *NIX системах и выполнения их на Веб Сервере.

Пример программы
Простейшая программа Hello world выглядит следующим образом:
#!/usr/bin/perl
print "Hello, world!\n";
Простой способ умножения на число 10 (с использованием конкатенации строк).
$x = 5;
$x .= 0;
print $x;
А вот так можно напечатать число Гугол.
print 1, 0 x 100;

Типы данных
Основные типы данных: скаляр, массив, хеш-таблица, функция, файловый дескриптор и константа. Переменные разных типов отличаются знаком, который стоит перед именем переменной.
$foo; # скаляр или указатель
@foo; # массив
%foo; # хеш-таблица
&foo; # функция
FOO; # дескриптор ввода-вывода или константа

•Скалярные переменные используются для хранения одиночных значений. Они могут содержать числа, строки и ссылки на другие объекты. Перед именем скалярной переменной необходимо ставить знак доллара '$'. Тип скалярной переменной не фиксирован (в отличие от, например, языка Си) и определяется динамически в зависимости от контекста. Например,
$x = 10; # число
$y = $x + 1; # используем $x как число…
$z = $x . 'string'; # … а теперь — как строку
$ref = \$x; # $ref является указателем на $x
$$ref=0; # $x содержит значение 0

•Массив является упорядоченным списком скаляров. Каждый элемент массива имеет порядковый индекс, с помощью которого к нему можно получить доступ. Нумерация элементов начинается с нуля, то есть первый элемент списка имеет индекс 0. Перед именем переменной-массива необходимо ставить знак '@', а для доступа к определенному элементу массива рекомендуется ставить знак '$', так как определенный элемент массива является скаляром . Многомерные массивы можно смоделировать, помещая в список ссылки на другие списки.
@array = (1,2,3,4); # записали в массив @array четыре элемента
print $array[2]; # напечатать третий элемент
print @array[2]; # также напечатать третий элемент, но рекомендуется использовать предыдущую версию

•Хеш-таблица представляет собой ассоциативный массив, позволяющий ассоциировать строку (называемую ключ) со скаляром (значение). Строка называется ключом, а скаляр в хеш-таблице значением. Перед именем переменной-списка необходимо ставить знак процента '%', а для доступа к определенному элементу массива рекомендуется ставить знак '$'.

Физически Хеш-таблица представляет собой массив, где в нечетных позициях находятся ключи, а на четных - значения.
%hash = (
'cat' => 'kitten',
'dog' => 'puppy',
'cow' => 'calf'
);
print $hash{'cat'}; #Напечатает kitten
print %hash{'cat'}; #Также напечатает kitten, но рекомендуется использовать предыдущую версию
print join("-", keys %hash) ; # Вывод всех ключей. Напечатает cat-dog-cow
print join("-", values %hash) ; # Вывод всех значений. Напечатает kitten-puppy-calf
print join("-", %hash) ; #Напечатает cat-kitten-cow-calf-dog-puppy
• Функция представляет собой фрагмент исполняемого кода. Функция всегда возвращает какое-либо значение либо UNDEF. Если возвращаемое значение явно не указано оператором return, возвращается последнее вычисленное значение.
sub printTwo
{
print 2;
}

sub three
{
3;
}

$s=\&three;
print &$s; #Напечатает 3

$s=\&printTwo;
print &$s; #Напечатает 21. `2` в коде функции, а `1` как значение, возвращаемое функцией printTwo
print &printTwo #То же самое

•Константа
Константа представляет собой неизменяемое значение. Использование:
use constant MY=>2;
print MY;

•Файловый дескриптор
Представляет собой указатель на файл, устройство или PIPE канал, открытые для записи, чтения или для записи и чтения
Использование:
$s=<STDIN>; #Читаем одну строку из дескриптора STDIN (стандартный поток ввода)
@values=<FILE>; #Читаем все строчки из некоторого открытого и связанного с дескриптором FILE файла.
print STDOUT $s; #Печатаем в STDOUT (стандартный поток вывода)
Регулярные выражения
В Perl встроена мощная поддержка регулярных выражений. Благодаря этому Perl очень эффективен для обработки текстов. Бо&#769;льшая часть работы с регулярными выражениями производится при помощи операторов =~, m// и s///.
Оператор m// используется для проверки на совпадение. В простейшем случае результат выражения $x =~ m/abc/ будет истинным если и только если строка $x будет соответствовать регулярному выражению abc.
Например:
Пример Значение
$x =~ /abc/ Строка $x содержит (под)строку «abc». Начальная буква «m» оператора при использовании // может быть опущена.
$x =~ m/a(.{1,3})c/ Строка $x содержит букву «a», затем от одного до трех любых символов, и затем букву «c». Найденные символы будут сохранены в переменную $1.
$x =~ m{^p(erl|ugs)$}i Строка $x строго равна «perl» или «pugs» без учета регистра. Так же, вместо // регулярное выражение окружено в {}.

Поиск и замена выполняются при помощи оператора s///. Конструкция $x =~ s/abc/def/; заменит первое вхождение регулярного выражения abc на строку def.
Пример Значение
$x =~ s/abc/def/g; Все вхождения (на что указывает флаг /g — global) подстроки «abc» в $x будут заменены на «def».
$x =~ s/a(.{1,3})c/!$1!/; Первое вхождение в $x буквы «a», затем от одного до трех любых символов, и затем буквы «c». будет заменено на эти символы между «a» и «c», окруженные «!». Например, «syntactic» станет «synt!cti!».
$x =~ s{^p(erl|ugs)}{"P" . lc $2}$/ieg; Здесь показан пример использования модификатора /e, указывающего на то, что вместо строки замены будет написан код, результат выполнения которого надо использовать. Все вхождения «perl» или «pugs» в любом регистре будут заменены на «Perl» и «Pugs», соответственно.

Поэзия в Perl
На Perl можно даже писать стихотворения. Одно из таких стихотворений под названием «Black Perl» («Чёрная жемчужина» или «Чёрный перл») было упомянуто Ларри Уоллом в первоапрельском письме в Usenet. Оно было написано изначально для Perl 3, и по словам самого Ларри, он испытал моральное удовлетворение, когда стихотворение не прошло синтактический анализатор в Perl 5.
BEFOREHEAD: close door, each window & exit; wait until time.
open spellbook, study, read (scan, select, tell us);
write it, print the hex whole each watches,
reverse its length, write again;
kill spiders, pop them, chop, split, kill them.
unlink arms, shift, wait & listen (listening, wait),
sort the flock (then, warn the "goats" & kill the "sheep");
kill them, dump qualms, shift moralities,
values aside, each one;
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice,
wait, redo ritual until "all the spirits are pleased";
do it ("as they say").
do it(*everyone***must***participate***in***forbidden**s*e*x*).
return last victim; package body;
exit crypt (time, times & "half a time") & close it,
select (quickly) & warn your next victim;
AFTERWORDS: tell nobody,
wait, wait until time;
wait until next year, next decade;
sleep, sleep, die yourself,
die at last