Статья
Версия для печати
Обсудить на форуме
Perl :: Маленькие этюды :: #1


Вступление


Для чего я начал эту серию статей? Прежде всего - мне нравится Perl. Еще - для поддержки раздела Perl на нашем форуме. Я хотел бы чаше видеть на нем любителей этого языка!

Лирика


Perl - один из самых интересных языков программирования, созданных за последнюю четверть века. Perl очень многогранен: с одной стороны, он очень сложен, с другой стороны, - очень прост. Думаю, Perl не устроит только приверженцев строгой модели ООП, т.к. он позволяет программисту самому выбирать уровень строгости и абстракции. Это очень дружелюбный язык и очень гибкий!
Если кому-то захочется еще больше лирики, рекомендую книгу "Programming Perl" ("Программирование на Perl") - там найдете много интересного и не только лирику - русское издание книги занимает 1152 страниц! Английский электронный вариент можно найти на сайте O'Reilly. Это лучшая книга о Perl, а среди авторов есть создатели этого языка.
При рождении Perl перенял лучшее из C, Shell и Awk, а позже, развиваясь самостоятельно, получил объектную модель и богатейшую коллекцию модулей - CPAN.
Наверное, не многие программисты PHP знают, что не будь Pеrl, не было бы и PHP. Ну, может быть, он и был бы, но, думаю, он был бы больше похож на ASP или что-то в этом роде.
Perl дал миру свою систему описания регулярных выражений для поиска и замены в строках - PCRE.
Perl... Короче, он еще много чего хорошего может...
Конечно, есть у него и недостатки, но мне они не мешают.

Маленький этюд #1 - Переопределение встроенных функций


В языке Perl есть понятие package - это нечто вроде namespace в C++. Package можно на ходу переключать, соответственно, попадая в другое простанство имен. Чтобы обратиться к имени объекта в другом пространстве имен, нужно либо указывать его перед именем объекта, либо импортировать имя в текущее пространство.
Имена объектов в Perl сохраняются во время исполнения программы и активно используются. Это отличие от компилируемых языков типа C/C++, где имена перестают иметь смысл после компиляции.
Еще в Perl есть набор встроенных функций. Они привязаны к package CORE и всегда доступны в текущем пространстве имен.
Perl позволяет переопределять эти функции, но и после переопределения их можно вызвать через префикс "CORE::".
Вот я и решил проверить, как это работает на примере функции print.

Код: (Perl)
#!/usr/bin/perl

use subs qw(print);

*print = sub # задание ф-ии для имени "main::print"
{
    CORE::print "Package: " . __PACKAGE__ . "\n";
};

print("aaa\n"); # вызывается "STDOUT->print" или "print STDOUT"
&print("aaa\n"); # вызывается ф-ия print из текущего пакета ("main")
main::print("aaa\n"); # явно вызывается "main::print"

=pod
    Результат:
aaa
Package: main
Package: main
=cut


Делайте выводы!
Задавайте вопросы!

10.12.2006 Чернышов Роман (RXL).

При оформлении статьи использован редактор Art Editor V2.0 нашего софорумца x77.
Отдельное спасибо Sel за борьбу с моей неграмотностью. :)
Версия для печати
Обсудить на форуме