Perl: специальные переменные

Язык Perl определяет некоторые специальные переменные, обычно с префиксом $, @ или %, например: $_.

Многие специальные переменные имеют длинное английское имя; переменная ошибки ОС $! может быть записана как $OS_ERROR.

Если вы хотите использовать специальные переменные с английскими именами, вам нужно добавить следующее в начале программы:use English;Это позволяет использовать описательные английские имена специальных переменных.

Наиболее часто используемая специальная переменная — $_, она содержит содержимое ввода и сопоставления с шаблоном по умолчанию. Пример:

Пример

#!/usr/bin/perl foreach ('Google','Example','Taobao') { print $_; print "\n"; }

Запуск приведённой выше программы даёт следующий вывод:

Google
Example
Taobao

В следующем примере мы не используем $_ для вывода содержимого:

Пример

#!/usr/bin/perl foreach ('Google','Example','Taobao') { print; print "\n"; }

Запуск приведённой выше программы даёт следующий вывод:

Google
Example
Taobao

В примере сначала выводится "Google", затем выводится "Example", и наконец выводится "Taobao".

В цикле итерации текущая строка цикла помещается в $_, затем выводится через print. Кроме того, print по умолчанию использует $_, если переменная вывода не указана.

Ниже приведены случаи, когда Perl подразумевает использование $_, даже если это явно не написано:

  • Различные унарные функции, включая такие функции, как ord() и int(), а также все операторы проверки файлов ("-f", "-d"), кроме "-t"; "-t" по умолчанию работает со STDIN.
  • Различные списочные функции, такие как print() и unlink().
  • Операции сопоставления с образцом "m//", "s///" и "tr///", когда оператор "=~" не используется.
  • Переменная итерации по умолчанию для цикла "foreach", когда другая переменная не указана.
  • Неявная переменная итерации для функций grep() и map().
  • Когда "while" имеет только одно условие и это условие проверяет результат операции "<>", $_ является местом по умолчанию для сохранения входной записи. Это происходит только в условии проверки "while". (Мнемоника: знак подчёркивания можно опускать в некоторых операциях.)

Типы специальных переменных

В соответствии с особенностями использования специальных переменных их можно разделить на следующие категории:

  • Глобальные скалярные специальные переменные.

  • Глобальные специальные переменные-массивы.

  • Глобальные специальные переменные-хэши.

  • Глобальные специальные файловые дескрипторы.

  • Глобальные специальные константы.

  • Специальные переменные регулярных выражений.

  • Специальные переменные файловых дескрипторов.

Глобальные специальные скалярные переменные

Ниже перечислены все специальные скалярные переменные, включая как специальные символы, так и английские формы:

$_ Содержимое по умолчанию для ввода и сопоставления с шаблоном.
$ARG
$. Текущий номер строки последнего читавшегося файлового дескриптора.
$NR
$/ Разделитель входных записей, по умолчанию — символ новой строки. Если этой переменной присвоено значение undef, чтение будет продолжаться до конца файла.
$RS
$, Разделитель полей вывода.
$OFS
$\ Разделитель записей вывода.
$ORS
$" Эта переменная похожа на $,, но применяется при интерполяции значений массива и среза в строки в двойных кавычках (или аналогичные интерполируемые строки). По умолчанию — пробел.
$LIST_SEPARATOR
$; Разделитель, используемый при эмуляции многомерных массивов. По умолчанию — "\034".
$SUBSCRIPT_SEPARATOR
$^L Символ перевода страницы, отправляемый в канал вывода. По умолчанию — "\f".
$FORMAT_FORMFEED
$: Текущий набор символов, после которых строка может быть разорвана для заполнения полей продолжения (начинающихся с ^) в формате. По умолчанию — "\n"".
$FORMAT_LINE_BREAK_CHARACTERS
$^A Переменная, используемая для хранения форматированных данных перед печатью.
$ACCUMULATOR
$# Формат вывода чисел по умолчанию при печати чисел (устаревший).
$OFMT
$? Возвращает статус последней внешней команды.
$CHILD_ERROR
$! Числовое значение этой переменной — это значение errno, а строковое значение — соответствующая системная строка ошибки.
$OS_ERROR или $ERRNO
$@ Сообщение об ошибке от команды eval. Если пусто, это означает, что последняя команда eval выполнилась успешно.
$EVAL_ERROR
$$ Номер процесса текущего выполняемого Perl-скрипта.
$PROCESS_ID или $PID
$< Реальный идентификатор пользователя текущего процесса.
$REAL_USER_ID или $UID
$> Эффективный идентификатор пользователя текущего процесса.
$EFFECTIVE_USER_ID или $EUID
$( Реальный идентификатор группы текущего процесса.
$REAL_GROUP_ID или $GID
$) Эффективный идентификатор группы текущего процесса.
$EFFECTIVE_GROUP_ID или $EGID
$0 Содержит имя файла выполняемого скрипта.
$PROGRAM_NAME
$[ Индекс первого элемента массива, по умолчанию равен 0.
$] Номер версии Perl.
$PERL_VERSION
$^D Значение флага отладки.
$DEBUGGING
$^E Расширенная информация об ошибках операционной системы в средах, отличных от UNIX.
$EXTENDED_OS_ERROR
$^F Максимальный номер файлового дескриптора.
$SYSTEM_FD_MAX
$^H Статус проверки синтаксиса, активированный компилятором.
$^I Значение встроенного управляющего редактора.
$INPLACE_EDIT
$^M Размер альтернативного пула памяти.
$^O Имя операционной системы.
$OSNAME
$^P Внутренняя переменная, задающая текущее значение отладки.
$PERLDB
$^T Время начала выполнения скрипта в секундах, отсчитываемое от начала нового века.
$BASETIME
$^W Текущее значение переключателя предупреждений.
$WARNING
$^X Имя исполняемого двоичного файла Perl.
$EXECUTABLE_NAME
$ARGV Текущее имя файла при чтении из файлового дескриптора по умолчанию.

Специальные переменные глобальных массивов

@ARGV Список аргументов командной строки, переданных скрипту.
@INC Список каталогов для поиска при импорте модулей.
@F Массив входных данных командной строки.

Глобальные специальные хеш-переменные

%INC

Хеш %INC содержит все файлы, включённые с помощью операторов do или require. Ключ — имя файла, а значение — путь к файлу.

%ENV

Содержит текущие переменные окружения.

%SIG

Список сигналов и способы их обработки.

Глобальные специальные файловые дескрипторы

ARGV

Специальный файловый дескриптор, который перебирает все имена файлов в переменной-массиве @ARGV.

STDERR

Дескриптор стандартного вывода ошибок.

STDIN

Дескриптор стандартного ввода.

STDOUT

Дескриптор стандартного вывода.

DATA

Специальный файловый дескриптор ссылается на любое содержимое после маркера __END__ в файле, включая содержимое скрипта. Или он ссылается на всё содержимое после маркера __DATA__ в файле; __DATA__ существует до тех пор, пока вы читаете данные в том же пакете.

_ (подчёркивание)

Специальный файловый дескриптор, используемый для кэширования информации о файле (fstat, stat и lstat).

Глобальные специальные константы

__END__

Логический конец скрипта; следующий текст игнорируется.

__FILE__

Текущее имя файла.

__LINE__

Текущий номер строки.

__PACKAGE__

Имя текущего пакета; имя пакета по умолчанию — main.

Специальные переменные регулярных выражений

$n

Содержит n-ю подстроку последнего совпадения с шаблоном.

$&

Строка предыдущего успешного совпадения с шаблоном.

$MATCH

$`

Содержимое перед подстрокой предыдущего успешного совпадения.

$PREMATCH

$'

Содержимое после подстроки предыдущего успешного совпадения.

$POSTMATCH

$+

Последняя скобка, соответствующая формату предыдущего поиска по регулярному выражению. Например:

/Version: (.*)|Revision: (.*)/ && ($rev = $+);

$LAST_PAREN_MATCH

Специальные переменные дескриптора файла

$|

Если установлено в ноль, функция fflush автоматически вызывается после каждого вызова write или print, сбрасывая записанное содержимое обратно в файл.

$OUTPUT_AUTOFLUSH

$%

Текущий номер страницы вывода.

$FORMAT_PAGE_NUMBER

$=

Текущая длина страницы. По умолчанию — 60.

$FORMAT_LINES_PER_PAGE

$-

Количество строк, оставшихся на текущей странице.

$FORMAT_LINES_LEFT

$~

Имя текущего формата вывода отчета. Значение по умолчанию — имя файлового дескриптора.

$FORMAT_NAME

$^

Имя текущего формата заголовка отчета. Значение по умолчанию — имя файлового дескриптора с суффиксом "_TOP".

$FORMAT_TOP_NAME

Другие расширения