Буферизированный (потоковый) ввод-вывод
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(["размер_строки"]), где |
НАЗНАЧЕНИЕ: | Чтение всех строк файла в список; |
ОПИСАНИЕ: | Функция читает все строки файла в переменную список. Если строка с текстом имеет меньшую длину, чем указанная в фактическом параметре "размер_строки", то файл читается дальше до достижения указанного числа символов. Метод чтения всех строк эффективен для чтения очень больших файлов построчно; |
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Список текстовых строк из всего файла; |