Опубликован: 15.11.2010 | Уровень: для всех | Доступ: платный
Лекция 6:

Буферизированный (потоковый) ввод-вывод

6.2.4.2. Выполнение системных команд

Заключённая в обратные апострофы (`) строка или выражение, находящееся внутри записи операции "qx{…}", вызывает выполнение команды операционной системы. Когда интерпретатор Perl встречает строковый литерал в обратных апострофах, то, после подстановки значений скалярных переменных и элементов массива, интерпретатор передаёт получившуюся строку как команду на выполнение операционной системе.

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

В списковом контексте разбиение вывода команды операционной системы на элементы списка выполняется в соответствии со значением переменной "$/", являющимся разделителем. По-умолчанию это значение - "\n" ("EOL"). Если этой переменной присвоить другое значение, то будет использовано это значение для разбиения "вывода на строки". Этим разделителем может быть любая последовательность символов.

Приведём примеры выполнения операции ввода с использованием обратных апострофов.

Пример 6.9.

#!perl -w
# File ex06009.pl
# Пример тестировался на компиляторе ActiveState
# Perl 5.8.0
#
# Операция заключения в обратные кавычки
# в скалярном и списковом контекстах.
$command = "dir"; # Печать содержимого каталога
$scalar = `$command`; # Скалярный контекст
@list = `$command`; # Списковый контекст
print "\nСодержимое скалярной переменной\n";
print "-"x80;
print $scalar;
print "-"x80;
print "\nСодержимое трёх первых строк вывода\n";
print $list[0].$list[1].$list[2]."\n";
print "-"x80;
# Завершение работы
print "\n";
print STDERR "\nPress key Enter to Exit...";
$junk = <STDIN>;
# Конец файла

Пример 6.10.

#perl -w
#
# Программа для перевода имён файлов в MS WINDOWS в верхний регистр.
#
# Синтаксис:
# >perl ex06010.pl [аргументы…]
#
# где аргументы - имена файлов и каталогов
#
# ЗАМЕЧАНИЕ:
# Функция не переименовывает файлы и каталоги, в именах которых
# есть умляуты и кириллические символы
#
# Пример тестировался на компиляторе ActiveState
# Perl 5.8.0
#
#
$oldFileName = shift() or die "\nNo arguments";	# Читаем первый параметр скрипта
while( 1 )
{
# Цикл ПОКА есть параметры скрипта в командной строке
#
	$newFileName = uc( $oldFileName);		# Все символы в имени - в верхний регистр!
	qx{ren $oldFileName $newFileName};	# Переименование файла
	$oldFileNane = shift() or die"\nThe End of a script";		# Читаем следующий параметр скрипта или выход
}
# Конец процедуры

Пример 6.11.

#perl -w
#
# Программа для перевода имён файлов в MS WINDOWS в нижний регистр.
#
# Синтаксис:
# >perl ex06011.pl [аргументы…]
#
# где аргументы - имена файлов и каталогов
#
# ЗАМЕЧАНИЕ:
# Функция не переименовывает файлы и каталоги, в именах которых
# есть умляуты и кириллические символы
#
# Пример тестировался на компиляторе ActiveState
# Perl 5.8.0
#
#
$oldFileName = shift() or die "\nNo arguments";	# Читаем первый параметр скрипта
while( 1 )
{
# Цикл ПОКА есть параметры скрипта в командной строке
#
	$newFileName = lc( $oldFileName);	# Все символы в имени - в нижний регистр!
	qx{ren $oldFileName $newFileName};	# Переименование файла
	$oldFileNane = shift() or die"\nThe End of a script";		# Читаем следующий параметр скрипта или выход
}
# Конец процедуры
6.2.4.3. Ещё одно применение операции "ромб"

Ещё одно применение операции "ромб" состоит в получении имён файлов определённого каталога, удовлетворяющему заданному шаблону. В скалярном контексте "ромб" возвращает первое найденное имя файла в текущем каталоге, в списковом контексте - список имён всех файлов, удовлетворяющих заданному шаблону. В шаблонах допускается использовать метасимволы "*" и "?".

Пример иллюстрирует печать имён всех файлов с расширением "*.pl"

Пример 6.12.

#!perl -w
# File ex06012.pl
# печать имён всех файлов с расширением "*.pl"
#
# Пример тестировался на компиляторе ActiveState
# Perl 5.8.0
#
while ( $file = <*.pl> )
{
	print "$file\n";
}
# Завершение работы
print STDERR "\nPress key Enter to Exit...";
$junk = <STDIN>;
# Конец файла

6.2.5. Ввод средствами языка Python

Для ввода строки символов с клавиатуры используется встроенная функция raw_input. Её описание смотри ниже.

ФУНКЦИЯ RAW_INPUT
ОПРЕДЕЛЕНА В: Встроенная функция
СИНТАКСИС: value = raw_input([prompt]), где
  • value - вводимая строка текста;
  • prompt - необязательная подсказка для ввода текста;
НАЗНАЧЕНИЕ: Ввод строки символов с клавиатуры;
ОПИСАНИЕ: Функция вводит с клавиатуры строку до символа перевода строки. Если при вводе встречается символ конца файла "EOF", то возбуждается исключение EOFError.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Введённая строка символов.

ФУНКЦИЯ INPUT
ОПРЕДЕЛЕНА В: Встроенная функция;
СИНТАКСИС: input([prompt]), где prompt - необязательная подсказка для ввода текста;
НАЗНАЧЕНИЕ: Ввод с клавиатуры строки кода Питона;
ОПИСАНИЕ: Функция вводит с клавиатуры код Питона, что эквивалентно вызовам функций eval(raw_input()). Функция не защищена от ошибок пользователя, и вызывает исключение SyntaxError при ошибке синтаксиса. В-общем функция используется для быстрого ввода кода. В любых других случаях лучше использовать функцию raw_input() ;
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет.

Пример 6.13.

#! %PYTHON%/python
# -*- coding: cp866 -*-
# Пример тестировался на компиляторе ActiveState
# Python 2.5.
#
# Файл ex06013.py
def ex06013():
	while 1:
# Попытка ввода целого числа
		try:
			print 'Введите целое число: '
			number = int( raw_input() )
			break
		except	ValueError:
			print "Вы ошиблись. Попробуйте ещё раз..."
	print 'Введённое значение - %10d' % number;
# Завершение программы
	junk = raw_input( 'Press key Enter to Exit...')
# Конец программы

Пример 6.14.

#! %PYTHON%/python
# -*- coding: cp866 -*-
# Пример тестировался на компиляторе ActiveState
# Python 2.5.
#
# Файл ex06014.py
def ask_ok(prompt, retries=4, complaint='Да или Нет, пожалуйста!'):
	while 1:
		ok = raw_input( prompt )
		if ok in ('д', 'да', 'Д', 'Да'): return 1
		if ok in ('н', 'не', 'нет', 'Н', 'НЕ', 'НЕТ', 'Нет'): return 0
		retries = retries - 1
		if retries < 0:
			raise IOError(
				'Пользователь отказывается отвечать')
		print complaint
def ex06014():
	print 'Начало функции'
	ok = ask_ok('Да или Нет? ')
	if ok == 1 : print 'нажато Да'
	if ok == 0 : print 'нажато Нет'
# Завершение программы
	junk = raw_input( 'Press key Enter to Exit...')
# Конец программы
ФУНКЦИЯ READ
ОПРЕДЕЛЕНА В: Везде
СИНТАКСИС: value = f.read(["число_байт"]), где
  • value - прочтённая строка;
  • f - дескриптор файла;
  • "число_байт" - количество прочтённых байт;
НАЗНАЧЕНИЕ: Чтение из файла числа байтов, указанных в качестве аргумента;
ОПИСАНИЕ: Данный метод читает из файла с дескриптором f, открытым для чтения, числа байтов, указанных в качестве аргумента. Если метод выполняется без параметров, то читается весь файл. И если он прочитан до конца, то метод возвращает пустую строку.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Строка текста, прочтённая из файла;

ФУНКЦИЯ READLINE
ОПРЕДЕЛЕНА В: Везде
СИНТАКСИС: value = f.readline(), где
  • value - прочтённая строка;
  • f - дескриптор файла;
НАЗНАЧЕНИЕ: Чтение одной строки из файла;
ОПИСАНИЕ: Данный метод читает одну строку из файла с дескриптором f до символа перевода строки "EOL" (включая сам этот символ). Если строка состоит только из символа перевода строки, то метод readline возвращает пустую строку. Если в конце файла нет пустой строки с символом "EOL", то возвращаемый результат не определён (этого допускать нельзя)!
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Введённая строка символов.

В качестве дескриптора файла можно указать стандартный дескриптор sys.stdin (дескриптор стандартного потока ввода, Таблица 6.1).

ФУНКЦИЯ READLINES
ОПРЕДЕЛЕНА В: Везде;
СИНТАКСИС: value = f.readlines(["размер_строки"]), где
  • value - переменная-список;
  • f - дескриптор файла;
  • "размер_строки" - необязательный параметр длины строки с текстом;
НАЗНАЧЕНИЕ: Чтение всех строк файла в список;
ОПИСАНИЕ: Функция читает все строки файла в переменную список. Если строка с текстом имеет меньшую длину, чем указанная в фактическом параметре "размер_строки", то файл читается дальше до достижения указанного числа символов. Метод чтения всех строк эффективен для чтения очень больших файлов построчно;
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Список текстовых строк из всего файла;