В этом номере я хотел бы открыть рубрику - 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;
после чего скрипт начал работать как надо. |