Перенаправление ввода

Многие интерактивные программы получают пользовательский ввод с клавиатуры. Однако зачастую гораздо удобнее «скормить» программе содержимое текстового файла. Такой способ подачи входных данных называется перенаправлением ввода.

Посмотрим, как перенаправление ввода работает с программой на языке Haskell. Для начала создадим текстовый файл, содержащий небольшое хайку, и сохраним его под именем haiku.txt:

Я маленький чайник

Ох уж этот обед в самолёте

Он столь мал и невкусен

Ну да, хайку, прямо скажем, не шедевр – и что? Если кто в курсе, где найти хороший учебник по хайку, дайте знать.

Теперь напишем маленькую программу, которая непрерывно читает строку ввода и выводит её в верхнем регистре:

import Control.Monad

import Data.Char

main = forever $ do

   l <- getLine

   putStrLn $ map toUpper l

Сохраните эту программу в файле capslocker.hs и скомпилируйте её.

Вместо того чтобы вводить строки с клавиатуры, мы перенаправим на вход программы содержимое файла haiku.txt. Чтобы сделать это, нужно добавить символ < после имени программы и затем указать имя файла, в котором хранятся исходные данные. Посмотрите:

$ ghc capslocker

[1 of 1] Compiling Main  ( capslocker.hs, capslocker.o )

Linking capslocker ...

$ ./capslocker < haiku.txt

Я МАЛЕНЬКИЙ ЧАЙНИК

ОХ УЖ ЭТОТ ОБЕД В САМОЛЁТЕ

ОН СТОЛЬ МАЛ И НЕВКУСЕН

capslocker: <stdin>: hGetLine: end of file

То, что мы проделали, практически эквивалентно запуску программы capslocker, вводу нашего хайку с клавиатуры и передаче символа конца файла (обычно это делается нажатием клавиш Ctrl+D). С тем же успехом можно было бы запустить capslocker и сказать: «Погоди, не читай ничего с клавиатуры, возьми содержимое этого файла!».