Шаг 6 - Специальные переменные

Сегодня наши программки обретут интерактивность, в какой-то степени. В Perl есть переменные имеющие специальное значение. Многие из них доступны только для чтения, то есть при попытке присвоения такой переменной какого-либо значения происходит ошибка. Значение некоторых из них вы поймёте и оцените позже, а пока давайте рассмотрим их по порядку.

$_ В эту переменную по умолчанию происходит ввод, присваивание, в нее складываются результаты поиска по заданному образцу.

$. Эта переменная содержит номер строки, которая была почитана последней из файла, который был прочитан последним. Она также доступна только для чтения.

$/ Содержит символ, по которому разделяются вводимые записи. По умолчанию содержит символ перевода строки.

$| По умолчанию имеет значение 0. Если содержит ненулевое значение, то происходит сброс буферов каждый раз после осуществления вывода (на печать, на экран и т.д.).

$, Содержит символ-разделитель полей для оператора печати.

$ Содержит символ-разделитель записей для оператора печати. Вы можете определить $ вместо того, чтобы печатать \n в конце печати.

$" Подобна переменной $,. Но используется при обращении к списку величин в двойных кавычках (или другой строке, которая требует интерпретации). По умолчанию содержит символ пробел.

$; Содержит символ-разделитель для эмуляции многомерных хэшей (по умолчанию - \034).

$# Формат для печати чисел. Первоначально содержит значение %.20g.

$% Содержит номер текущей выводимой страницы.

$= Содержит длину текущей страницы (количество печатных срок), обычно содержит значение 60.

$- Содержит значение, определяющее количество оставшихся на странице строк, например количество еще не напечатанных строк для печатного канала вывода.

$~ Содержит имя текущего формата сообщений. Обычно имя дескриптора файла.

$^ Содержит имя текущего формата заголовка страницы. Обычно содержит имя дескриптора файла с добавлением в конце _TOP.

$: Содержит множество символов после которых вывод сроки может быть прерван и начат снова после перевода строки.

$! Если эта переменная используется в числовом контексте, то содержит текущее значение errno (номер ошибки) со всеми обычными сообщениями. В строковом контексте содержит соответствующее системное сообщение об ошибке.

$@ Содержит сообщение о синтаксической ошибке, допущенной во время исполнения последней команды eval(). Если содержит значение 0, то команда была исполнена корректно.

$$ Содержит идентификатор текущего процесса.

$< Содержит идентификатор пользователя (UID), которому принадлежит текущий процесс.

$> Содержит эффективный UID текущего процесса.

$( Содержит идентификатор группы (GID) пользователя, которому принадлежит текущий процесс.

$) Содержит эффективный GID текущего процесса.

$0 Содержит имя файла, в котором находится исполняемая программа.

$ARGV Содержит имя текущего файла, из которого происходит чтение.

@ARGV Содержит массив аргументов командной строки, которые были переданы программе.

@INC Содержит список точек входа в программу, в которых используются конструкции do, require и use.

%INC Содержит входы для каждого файла, который включается посредством использования операторов do или require. Ключами являются имена файлов, а значениями места их расположения.

%ENV Содержит текущее окружение процесса. Изменением содержимого хэша можно изменить окружение порожденного (дочернего) процесса.

%SIG Этот хэш используется для установки обработчиков различных сигналов.

Пока сильно не заморачивайтесь. Вам ещё предстоит не раз столкнуться с каждой из этих переменных. А на примерах легче понимается. Переменные $$, $<, $>, $(, $) под виндой нам не нужны вообще. А интересны нам - $_, $., @ARGV, %ENV, %SIG, $!, $@. Внимательный читатель уже заметил, встречавшиеся нам ещё в 4-ом шаге, переменные $_ и %ENV. Так вот, хэш %ENV содержит в себе переменные окружения. Попробуйте выполнить print $ENV{'PATH'} и он выведет вам переменную окружения PATH. У сервера есть свои переменные окружения, например, REMOTE_ADDR. Она содержит IP адрес, подключившегося к серверу хоста. Без переменной $_ можно бы было обойтись в примере из 4-го шага, если переписать его так

#!/usr/bin/perl -w

print "Content-Type: text/plain\n\n";
foreach $key (keys(%ENV)) {
	$val = $ENV{$key};
	print "$key=\"$val\"\n";
}

Не указав в цикле foreach (о нём мы поговорим в следующем шаге) переменную для присваивания результата работы функции keys(%ENV), мы фактически сказали Perl присваивать результат переменной по умолчанию - $_. Эта переменная очень удобна и часто поволяет упростить программу, в чём вы ещё не раз убедитесь.

А теперь о @ARGV и "интерактивности". Один из методов управления работой программы - это параметры передаваемые ей в командной строке при запуске. Все они хранятся в массиве @ARGV. print $ARGV[0] выведет вам первый параметр, если он есть.

Для этого шага, пожалуй, всё. До встречи в следующем.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Горностаев Сергей aka Deadcat - 05.02.2004