Буферизированный (потоковый) ввод-вывод
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]), где
|
| НАЗНАЧЕНИЕ: | Ввод строки символов с клавиатуры; |
| ОПИСАНИЕ: | Функция вводит с клавиатуры строку до символа перевода строки. Если при вводе встречается символ конца файла "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(["число_байт"]), где |
| НАЗНАЧЕНИЕ: | Чтение из файла числа байтов, указанных в качестве аргумента; |
| ОПИСАНИЕ: | Данный метод читает из файла с дескриптором f, открытым для чтения, числа байтов, указанных в качестве аргумента. Если метод выполняется без параметров, то читается весь файл. И если он прочитан до конца, то метод возвращает пустую строку. |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Строка текста, прочтённая из файла; |
| ФУНКЦИЯ | READLINE |
| ОПРЕДЕЛЕНА В: | Везде |
| СИНТАКСИС: | value = f.readline(), где |
| НАЗНАЧЕНИЕ: | Чтение одной строки из файла; |
| ОПИСАНИЕ: | Данный метод читает одну строку из файла с дескриптором f до символа перевода строки "EOL" (включая сам этот символ). Если строка состоит только из символа перевода строки, то метод readline возвращает пустую строку. Если в конце файла нет пустой строки с символом "EOL", то возвращаемый результат не определён (этого допускать нельзя)! |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Введённая строка символов. В качестве дескриптора файла можно указать стандартный дескриптор sys.stdin (дескриптор стандартного потока ввода, Таблица 6.1). |
| ФУНКЦИЯ | READLINES |
| ОПРЕДЕЛЕНА В: | Везде; |
| СИНТАКСИС: | value = f.readlines(["размер_строки"]), где |
| НАЗНАЧЕНИЕ: | Чтение всех строк файла в список; |
| ОПИСАНИЕ: | Функция читает все строки файла в переменную список. Если строка с текстом имеет меньшую длину, чем указанная в фактическом параметре "размер_строки", то файл читается дальше до достижения указанного числа символов. Метод чтения всех строк эффективен для чтения очень больших файлов построчно; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Список текстовых строк из всего файла; |