Изучаем Perl
975b8bba

Базовые средства ввода-вывода^


1. Вот один из способов решения этой задачи:

print reverse о;

Вас, может быть, удивит краткость этого ответа, но он, тем не менее, верен. Вот как работает этот механизм:

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

б) Затем функция reverse меняет порядок следования элементов списка на обратный.

в) Наконец, функция print получает список-результат и выводит его. И. Вот один из способов решения этой задачи:

print "List of strings:\n";

chomp(@strings = <STDIN>) ;

foreach (@strings) (

printf "%20s\n", $_;

)

Первая строка приглашает ввести список строк.

Следующая строка считывает все строки в один массив и избавляется от символов новой строки.



В цикле foreach осуществляется проход по этому массиву с присвоением переменной $_ значения каждой строки.

Функция printf получает два аргумента. Первый аргумент определяет формат "%20s\n", который означает 20-символьный столбец с выравниванием справа и символ новой строки.

3. Вот один из способов решения этой задачи:

print "Field width: ";

chomp($width = <STDIN>) ;

print "List of strings:\n";

chomp(@strings = <STDIN>);

foreach (@strings) (

printf "%$(width}s\n", $_;

}

В решение, данное к предыдущей задаче, мы добавили приглашение ввести ширину поля и ответ на него.

Есть еще одно изменение: строка формата printf теперь содержит ссылку на переменную. Значение переменной $width включается в эту строку до того, как printf использует данный формат. Отметим, что мы не можем записать эту строку как

printf "%$widths\n", $_; #WRONG

потому что тогда Perl искал бы переменную с именем $ widths, а не переменную с именем $width, к которой мы прибавляем букву s. По-другому это можно записать так:

printf "%$width"."s\n", $_; * RIGHT

потому что символ конца строки завершает также имя переменной, защищая следующий символ от присоединения к имени.



Содержание раздела