В этом номере я хотел бы открыть рубрику - FAQ, по всем языкам программирования. Для начала это Perl, возможно потом здесь появятся и остальные языки.
Каждый день я отвечаю на 10-15 вопросов по Perl программированию, сам задаю вопросы, и в общем-то багаж этих вопросов/ответов довольно большой, но в этот FAQ я вынес наиболее интересные решения проблем. Думаю, публикация здесь, этих решений будет полезна всем. Итак, открывает наш FAQ Programming, язык Perl.

Q: Как мне записать данные в xml файл используя метод XMLout() модуля XML::Simple. В документации к модулю даны примеры получения информации путем метода XMLin(), а пример и четкое объяснение использования XMLout() - нет.
A: Для этого создайте ссылку на набор анонимных хэшей (как это сделать - описано в документации), после чего передайте методу XMLout() эту ссылку и параметр outputfile => 'FileName.xml'. Пример:

my $xs = new XML::Simple();
my $xml = $xs->XMLout($hashref,outputfile =>'./write.xml');

Q: У меня проблемы с утилитой ppm, она не хочет работать через прокси. Я скачал модули, и пытаюсь установить их при помощи ppm локально - но ppm не находит их.
A: Для того чтобы установить модули при помощи ppm локально, требуется следующее:
а) модули нужно скачивать с сайта ActiveState, так как модули которые находятся на CPAN имеют другой формат и ppm их не понимает.
б) нужно отключить все репозитории, и добавить свою репозиторию в настройках ppm. Делается это так:

C:\>ppm
ppm> rep
[1] ActiveState PPM2 Repository
[2] SomeRepository
ppm>rep off 1
ppm>rep off 2
ppm>rep add MyRepository C:\MyModulsDir
ppm>rep
[1] MyRepository

Затем можно давать команду install Имя::Модуля.

Q: Объясните назначение переменных $1,$2,$3... Для чего они нужны и как используются?
A: Эти переменные применяются в регулярных выражениях. В результате поиска по шаблону, в эти переменные подставляются значения соответствующие подшаблону регулярного выражения заключенного в круглые скобки. Каждая пара круглых скобок соответствует своей переменной $1...$n. Для простоты понимания приведу пример:
my $string="THIS IS NUM 1 2 3";# строка для поиска
$string=~/(\w+)\s(\w{2})\s(\w{3})\s(\d\s\d\s\d)/;# шаблон с подшаблонами в круглых скобках
print "$1\n$2\n$3\n$4\n";
Результат работы скрипта:
THIS
IS
NUM
1 2 3

То есть переменные $1,$2...$n принимают значения совпадающие с выражением в круглых скобках (и в языке Perl нет ограничения до 9-ти переменных как в JAVA, поэтому работают и такие переменные как $10,$11,$12 и т.п). Эти переменные являются read-only, И поэтому операции вида ~s///; substr, и т.п недопустимы с ними. Так же переменная $0 не относится к этому виду переменных (она содержит в себе имя программы).

Q: У меня проблема с использованием параметра SO_REUSADDR при открытиии сокета. Скрипт ругается вот таким вот сообщением "Argument "SO_REUSADDR" isn't numeric in setsockopt", что делать?

A: Я сам столкнулся с такой же проблемой. Я решил ее так,
Поставил в начале скрипта вот такую строчку:

use constant SO_REUSADDR => 1;

после чего скрипт начал работать как надо.

Автор: PoizOn /20.02.05/ ©

Mazafaka.Ru - E-Zine - 2005 ©