Шаг 25.
Операция ввода команды

    На этом шаге мы рассмотрим операцию выполнения команды.

    Заключенная в обратные кавычки "`" строка символов является удобной формой записи операции ввода команды операционной системы.

    Когда интерпретатор Perl встречает строковый литерал в обратных кавычках, он осуществляет подстановку в нее значений скалярных переменных и переменных массивов и передает получившуюся строку, как команду, на выполнение операционной системе. Последняя выполняет ее и возвращает в строковый литерал результаты вывода команды на стандартное устройство вывода, которым обычно является экран монитора. В связи с таким "поведением" строкового литерала в обратных кавычках его иногда называют псевдолитералом.

    Операция ввода команды различает скалярный и списковый контексты, в которых она может выполняться. В скалярном контексте возвращается одна строка, содержащая весь вывод на экран монитора выполненной команды, включая символы новой строки в случае многострочного вывода. В списковом контексте возвращается список значений, каждое из которых содержит одну строку вывода. Следующий пример демонстрирует использование операции ввода команды в соответствующих контекстах.

#! perl -w

$command = "dir";
$scalar = `$command`;  # Скалярный контекст.
@list = `$command`;    # Списковый контекст.
print $scalar;
print $list[0], $list[1];
Текст этого примера можно взять здесь.

    Результат работы приложения изображен на рисунке 1:


Рис.1. Результат работы приложения

    При выполнении операции заключения в кавычки сначала осуществляется подстановка значения скалярной переменной $command, а потом полученная строка передается на выполнение операционной системе. Переменная $scalar (скалярный контекст) содержит весь вывод на экран монитора содержимого текущего каталога, поэтому при ее печати мы увидим все, что вывела команда dir. Когда результаты выполнения команды присваиваются массиву @list (списковый контекст), то каждая строка вывода команды становится элементом массива, поэтому последний оператор печати этого примера выводит первую и вторую строки.

    В списковом контексте разбиение вывода команды операционной системы на элементы списка осуществляется в соответствии со значением встроенной переменной $/, которое используется в качестве разделителя. По умолчанию эта переменная содержит символ конца строки "\n" - поэтому и разбиение на элементы происходит по строкам. Присваивая этой переменной новое значение, мы тем самым определяем новое значение разделителя, которое будет использоваться при формировании элементов списка. Разделителем может быть любая последовательность символов. Например, в приведенном ниже примере в качестве разделителя задается строка "<DIR>":

#! perl -w

$/  =  "<DIR>";
@list = `dir`;   # Списковый контекст.
print  $list[0],  $list[1];
Текст этого примера можно взять здесь. Результат работы приложения изображен на рисунке 1:


Рис.2. Результат работы приложения

    Теперь, в отличие от первого примера, элемент массива $list[0] содержит не первую строку вывода команды dir, а вывод команды до первой встретившейся в нем последовательности символов "<DIR>". Аналогично, элемент $list[1] содержит вывод команды до следующей встретившейся последовательности символов "<DIR>" и т.д. Таким образом, чтобы получить результат, аналогичный полученному в первом примере, необходимо дополнить последнюю функцию print конструкцией $list[2].

    Команда, содержащаяся в псевдолитерале, выполняется всякий раз, как вычисляется этот псевдолитерал. Встроенная переменная $? содержит числовое значение состояния выполненной команды.

    Отметим, что операция ввода команды возвращает вывод на стандартное устройство вывода операционной системы. При выполнении команды можно направить ее вывод на другое устройство, например, в файл. Для этого в строке после имени команды и всех необходимых для ее выполнения параметров следует задать символ ">", после которого ввести имя файла. В этом случае на экран монитора ничего выводиться не будет, а следовательно и ничего не будет возвращаться в псевдолитерал, т. е. после выполнения такой команды псевдолитерал будет содержать неопределенное значение.

#! perl -w

$/ = "<DIR>";
$list = `dir >file.dat`; # Вывод осуществляется в файл file.dat.
print $list;	         # Оператор ничего не напечатает!
Текст этого примера можно взять здесь.

    На следующем шаге рассмотрим операцию <>.




Предыдущий шаг Содержание Следующий шаг