Perl
Розширення PHP Perl був реалізований, щоб використовувати Perl код в PHP. Це оболонка, яка вбудовує інтерпретатор Perl і перетворює дані в Perl PHP і назад. На момент написання дає лише один спосіб-інтерфейс PHP на Perl, але в майбутньому вона може бути продовжена здійснювати повний інтерфейс в обох напрямках. Розширення Perl дозволяє програмісту робити наступні зі сценаріїв PHP:
- Завантажити та виконати файли Perl
- Оцінки коду Perl
- Доступ змінних Perl
- Виклику Perl функції
- Примірник Perl об'єктів екземплярів
- Доступу до властивостей об'єктів Perl
- Виклику методів об'єктів Perl
Всі ці функції доступні через єдиний клас API називається Perl. Останню розробку версії можна отримати за допомогою наступної команди CVS:
$ CVS-D: PServer: cvs.php.net: / сховище спільно PECL / Perl
Якщо у вас є повний Perl установки, воно буде працювати з нею. Якщо у вас немає Perl на борту, ви можете спілкуватися з Perl інтерпретатор PHP шляхом, поставивши копію perl58.so perl58.dll або десь PHP можна знайти (у папці PHP або у системний шлях). Перекладач в Perl
Щоб отримати доступ до Perl перекладач з PHP, ви повинні спочатку створити екземпляр класу Perl. Його конструктор може отримувати кілька параметрів, але ми їх кладемо в цій точці. Вони необхідні для роботи з Perl об'єктів, але не для роботи з перекладачем себе.
$ Perl = новий Perl ();
Цей рядок коду створює екземпляр Perl перекладача. Можна створити кілька примірників перекладача, але все вони будуть використовувати ті ж одна всередині країни, так що весь код та змінні будуть загальними для всіх випадків. Об'єкт $ Perl можуть бути використані для виконання зовнішніх файли Perl, оцінити вбудований код Perl, доступ Perl змінні і функції виклику Perl.
Зовнішні Perl файли можуть бути завантажені використанням Perl:: вимагає () метод. Погляньте на наступний приклад:
Приклад 1 (test1.pl)
друк "Привіт з Perl!"
Приклад 1 (test1.php)
<? PHP
друк "Привіт з PHP!";
$ Perl = новий Perl ();
$ Perl -> вимагає ("test1.pl");
друк "Bye!";
?>
У цьому прикладі Perl заходів рядок безпосередньо у вихідний потік, PHP, але в деяких випадках вам потрібно буде взяти вихідний, як струна, і обробити його за допомогою коду PHP. Це може бути зроблено з використанням даних, PHP буферизації API:
Приклад 2 (test2.php)
<? PHP
ob_start ();
$ Perl = новий Perl ();
$ Perl -> вимагає ("test1.pl");
$ З ob_get_contents = ();
ob_end_clean ();
друк "Perl: $ з";
?>
Як бачите, це працює відмінно. Звичайно ж можна зробити за допомогою системного виклику PHP, але менш ефективно. Системи () функція почне перекладача кожного разу це називається, в той час як $ Perl-> EVAL () використовується вбудований перекладач в одному адресному просторі, і немає необхідності для створення нового процесу. Як було сказано раніше, PHP Perl розширення можна оцінити вбудований Perl-код. Цей метод є більш корисним, якщо ви хочете виконати невеликий фрагмент коду. У Perl:: EVAL () метод вам не потрібно, щоб створити кілька невеликих файлів Perl, але замість цього просто вставляти Perl код в PHP. </br>
Приклад 3 (test3.php)
<? PHP
друк "Привіт з PHP!";
$ Perl = новий Perl ();
$ Perl -> EVAL ("Друк" Привіт з Perl! ");
друк "Bye!";
?>
Perl:: EVAL () приймає лише один аргумент - Perl-код для виконання в суворій форматі. PHP дозволяє три різних способу запису строкових літерали; одинарними лапками, подвійними лапками або Heredoc. Зверніть увагу, що PHP буде діяти на утримання символьні рядки у звичайному порядку, перш ніж вони пройшли до Perl.
У попередньому прикладі ми не отримали будь-яких несподіваних результатів Perl:: EVAL (), але ми могли б це зробити. Perl перекладач може виконати той же код в різних контекстах, і результат може бути дуже різним у цих різних контекстах. Наприклад, список повернувся в скалярному контексті будуть отримані в якості останнього елементу в цьому списку.
Perl використовує об'єкт скалярному контексті за замовчуванням, але оцінки в масив або хеш контексті [1] вимагає використання спеціальних прийомів. Метод EVAL () не повинен викликатися безпосередньо на Perl об'єкта перекладача, але і на відповідних власності (масив або хеш).</br>
Приклад 4 (test4.php)
<? PHP
$ Perl = новий Perl ();
var_dump ($ Perl -> EVAL ('("", "б", "C ")')); / / EVAL в скалярному контексті
var_dump ($ Perl -> масив -> EVAL ('("", "б", "C ")')); / / EVAL в контексті масиву
var_dump ($ Perl -> хеш -> EVAL ('("", "б", "C ")')); / / EVAL в контексті хеш
/ * Висновок:
рядок (1) "з"
масив (3) (
[0] =>
рядок (1) ""
[1] =>
рядок (1) "б"
[2] =>
рядок (1) "з"
)
масив (2) (
[""] =>
рядок (1) "б"
["С"] =>v
NULLv
)
- /
?>
Цей приклад обчислює ті ж дані - список, - у різних контекстах, і як ви можете бачити, Є три різних результату від цих даних. Perl має кілька областей застосування глобальних змінних (скалярів $ г, @ х масивів, хеші% х і код і х). Perl розширенням PHP дозволяє вам отримати доступ до глобальної скаляр, масив і хеш-змінних. Щоб отримати доступ до скалярних змінних Perl, використовуйте нерухомість з такою ж назвою. Щоб отримати доступ до масив і хеш-змінних, використовувати той же трюк, як для вибору оцінки контексті. </br>
Приклад 5 (test5.php)
<? PHP
$ Perl = новий Perl ();
$ Perl -> EVAL ('$ х = 1; @ х = 1 .. 4;% х = 1 .. 4');
var_dump ($ Perl -> х);
var_dump ($ Perl -> масив -> х);
var_dump ($ Perl -> хеш -> х);
/ * Висновок:</br>
Int (1)
масиву (4) (
[0] =>
Int (1)
[1] =>
Int (2)
[2] =>
Int (3)
[3] =>
Int (4)
)</br>
масив (2) (
[1] =></br>
Int (2)
[3] =>
Int (4)
)
- /
?>
Як бачите, тут ми маємо три змінні з такою ж назвою, але в різних діапазонах, і, звичайно, всі три мають різні значення. Розширення Perl дозволяє не тільки читати, але також письмово Perl змінних. Ви можете зробити це шляхом створення нового значення відповідного майна, проте, ви не можете змінити частину Perl масив або хеш. (Зміни не набудуть чинності.)
Оцінка Perl змінних тільки один простий взаємодії між PHP і Perl. Частіше за все ми повинні назвати одним Perl функції. Perl розширення PHP надає простий і елегантний спосіб це зробити. Вам потрібно лише викликати метод з відповідним ім'ям через перекладача, і передавати параметри до нього:
Приклад 6 (test6.php)
<? PHP
$ Perl = новий Perl ();
$ Perl -> EVAL ('
на південь суму (
мій $ х = зрушення (@_);
Еогеасп ту $ у (@ _) (
$ X + Y = $;
)
повернути $ х;
)
');
друк $ Perl -> Eval ("Сума (1, 2, 3, 4, 5, 6, 7, 8, 9)"). "";
друк $ Perl -> сума (1, 2, 3, 4, 5, 6, 7, 8, 9). "";
?>
Функція може отримувати параметри і повертати скаляр або складних значення. Як EVAL (), будь-який виклик функції може бути зроблено в одному з трьох різних контекстах (скаляр, масив або хеш), і контекст, можуть бути вказані в тому ж шляху.
Perl використовує пакети обмежити ім'я видимості змінних і функцій, а іноді нам необхідно викликати функції або отримати доступ до змінних з цих пакетів з допомогою кваліфікованих імен. Такі імена не підтверджує синтаксису PHP, але вони можуть бути використані з особливою побудувати -> ().
Приклад 7 (test7.php)
<? PHP
$ Perl = новий Perl ();
$ Perl -> EVAL ("використання Digest:: MD5 КЯ (md5_hex); ');
Ехо "PHP:";
var_dump (md5 ('Hello'));
Ехо "Perl:";
var_dump ($ Perl -> EVAL ('md5_hex ("Hello ");'));
var_dump ($ Perl -> md5_hex ("Привіт"));
var_dump ($ Perl -> ("Digest:: MD5:: md5_hex") ("Hello"));
?>
Цей приклад використовує зовнішній модуль Perl md5, яка завантажується під час виконання. Якщо у вас є повний Perl установка, завантаження та встановлення модулів CPAN так само просто, як завантаження архіву, виділяючи його на Perl каталог верхнього рівня і набравши: CD Perl Perl makefile.pl робити зробити тест зробити установки
у командному рядку. У системах Windows вам доведеться замінити робити з NMAKE, однак це буде працювати тільки якщо у вас є МСВС встановлені кошти.
Якщо у вас немає повної установки Perl - тобто ви працюєте у Perl як загальний об'єкт - це ще можна запускати Perl-модулів, коли вони були побудовані в інших місцях. Мінімальні умови, необхідні для виконання яких складається з всього набору Perl управління пакетами (*. м.) файли з perllib, а також повний perllibauto perllibDigest і каталогів.
Розширенням PHP Perl не можу назвати внутрішньої Perl функції (друк, читання і т.д.), вам потрібно буде використовувати Perl:: EVAL () для того, щоб отримати доступ до цих. Наприклад, для того, щоб включати мінімальний модуль навколишнього середовища, викладених вище, ви повинні зателефонувати за телефоном:
$ Perl-> Eval ("BEGIN (unshift (@ INC, 'perlenv_dirpath');)");
Використання Perl об'єктів Використання Perl об'єктів
Як і багато інших Мови програмування, Perl використовує об'єктно-орієнтований підхід, але він не має спеціального синтаксису для класів. Заняття тільки пакети, які відбуваються з забезпечити методи роботи з об'єктами, методи просто пакет функцій, які очікують посилання на об'єкт в якості першого аргументу; об'єкти просто посилання, які "знають", який клас вони належать.
Perl розширення дозволяє створювати екземпляри об'єктів з Perl скрипт і отримати доступ до їх властивостям і методам. Того ж класу Perl використовується для цього, але на цей раз вам необхідно передати аргументи на його конструктор. Першим аргументом є Perl клас (пакет) ім'я, друге додаткову назву конструктора, а всі, що залишилися аргументи конструктора від конкретних умов. Якщо ім'я конструктора не вказано, то конструктор за умовчанням використовується новий.
нові Perl ([рядок class_name, [рядок constructor_name, змішана аргументи]]);
Наступний приклад визначає клас Perl-Пойнт-2 з конструкторами, нові і Point. Перший конструктор не приймає ніяких спеціальних аргументів, другий одержує початкові значення координат. Цей клас має дві властивості, х, у і 2 методи, переміщати () і отримати (). Як бачите, метод переміщення () переміщається в точку, зміщення що зазначена в переданих їй аргументів. Метод отримати () є більш цікавим. Залежно від контексту, вона повертає поточні координати у вигляді рядка (в скалярному контексті) або у вигляді масиву (у контексті масиву).
Як і в рідній об'єктів PHP, ви можете викликати методи екземпляра Perl об'єктів і доступ до їх властивостями. Єдина відмінність полягає в контексті дзвінка. За замовчуванням методи викликаються в скалярному контексті. Для виклику їх у масив або хеш контексті, використовуючи той же трюк, як раніше: метод не повинен викликатися безпосередньо на Perl об'єкта, але й на спеціальних власності (масив або хеш).
Всі властивості можуть бути доступні безпосередньо (без масиву або хеш власності). Це відбувається тому, Perl об'єкти можуть містити лише скалярні властивості. Масиви і хеші представлені як посилання на них, а також посилання домішки в Perl. Властивості об'єкта можуть бути прочитані, написано, зміна і навіть не визначено, але частина майна не може бути змінена. Наприклад, ми не можемо змінити елемент масиву власності.
Приклад 8 (test8.php)
<? PHP
$ Perl = новий Perl ();
$ Perl -> EVAL ('
пакет Point;
на південь нові (
$ Це мій = зміну;
ту $ типу точка відліку ($ це) | | $ це;
ту $ самостійної = ();
$ Само-> (х) = 0;
$ Само-> (у) = 0;
благословити $ самостійної, $ типу
повернути $ себе;
)
підрозділ (
$ Це мій = зміну;
ту $ типу точка відліку ($ це) | | $ це;
ту $ самостійної = ();
$ Само-> (х) = зміну;
$ Само-> (у) = зміну;
благословити $ самостійної, $ типу
повернути $ себе;
)
на південь рухатися (
моя $ = самостійної зміни;
$ Само-> (х) + = зміну;
$ Само-> (у) + = зміну;
)
на південь отримати (
моя $ = самостійної зміни;
якщо (wantarray) (
повернення ($ самостійної-> (х), $ самостійної-> (у));
) (Інше
повернути $ самостійної-> (х). "Х". $ Само-> (у);
)
)
');
/ / Створюємо об'єкт Perl "Point" з конструктор "нового"
$ P1 = новий Perl ("Point");
var_dump ($ p1);
$ P1 -> х + = 100; / / змінити власності
відключеному ($ p1 -> у) / / undefine власності
var_dump ($ p1);
/ / Створюємо об'єкт Perl "Point" з конструктором "Point"
$ Р2 = новий Perl ("Point", "Point", 100, 200);
var_dump ($ р2);
$ Р2 -> рух (200, 200); / / Виклик "хід"
var_dump ($ р2 -> отримати ()); / / Виклик "отримати" у скалярному контексті
var_dump ($ р2 -> масив -> отримати ()); / / Виклик "отримати" в контексті масиву
Ехо $ р2 -> х. "." . $ Р2 -> у. ""; / / Друк Perl властивості об'єкта
?>
Обробка помилок
Perl модуль використовує механізм PHP винятком повідомити Perl помилок. Спеціальний клас винятку, PerlException, використовується для цього. У наступному прикладі намагається оцінити недійсними Perl коду, і, як наслідок Perl:: EVAL () генерує PerlException:
Приклад 9 (test9.php)
<? PHP
$ Perl = новий Perl ();
(Спробувати
var_dump ($ Perl -> EVAL ('$ = $ и ($ D ).'));
Ехо "OK";
)
спіймати (PerlException $ виняток) (
Ехо "Perl про помилку:". $ Виняток -> GetMessage (). "";
)
?>
Винятки можуть бути кинуті на Perl:: EVAL (), Perl:: вимагати (), чи заклик до Perl функції, методу чи конструктора об'єкта.