Изучаем Perl


Глава 15 "Другие операции преобразования данных " 1 Вот один из способов решения этой задачи


while (о) { chomp;

$slash = rindex ($_,"/");

if ($slash > -1) (

$head = substr($_,0,$slash);

$tail = substr($_,$slash+l);

} else (

($head,$tail) = ("", $_) ;

) print "head = '$head', tail = '$tail'\n";

>

Каждая строка, прочитанная операцией "ромб", сначала пропускается через операцию chomp, которая удаляет символ новой строки. Затем с помощью rindex () мы ищем в этой строке крайнюю справа косую черту. Следующие две строки разбивают строку на части, используя substr (). Если косой черты нет, то результат rindex равен -1, и этот вариант мы не рассматриваем. Последняя строка цикла выводит результат.

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

chomp(@nums = <STDIM>); # обратите внимание на особый случай

# использования chomp @nuros = sort ( $а <=> $b } @nums;

foreach (@nums) (

printf "%30g\n", $_;

}

В первой строке в массив @nums вводятся все числа. Во второй строке этот массив сортируется в числовом порядке, для чего используется встроенный оператор. Цикл foreach обеспечивает вывод результатов.

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

open(PW,"/etc/passwd") || die "How did you get logged in?";

while “PW” (

chomp;

($user, $gcos) = (split /:/)[0,4];

($real) = split!/,/, $gcos) ;

$real($user} = $real;

($last) = (split /\s+/, $real)[-l];

$last{$user} = "\L$last";

} close(PW) ;

for (sort by_last keys %last) (

printf "%30s %8s\n", $real($_}, $_;

>

sub by_last ( ($last($a} cmp $last($b}) || ($a cmp $b). }

В первом цикле создается хеш %last, ключи которого — регистрационные имена, а соответствующие им значения — фамилии пользователей, и хеш %геа1, содержащий полные реальные имена пользователей. Все символы переводятся в нижний регистр, чтобы, к примеру, FLINT-STONE, Flintstone и flintstone стояли рядом друг с другом.

Во втором цикле выводится %геа1, упорядоченный по значениям %iast. Это делается с использованием определения сортировки, предоставленного подпрограммой by_last.

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

while (<>) (

substr($_,0,I) =~ tr/a-z/A-Z/;

substr($_,!) — tr/A-Z/a-z/;

print;

1

Для каждой строки, прочитанной операцией "ромб", мы используем две операции tr — по одной для разных частей строки. Первая операция tr переводит первый символ строки в верхний регистр, а вторая переводит все остальные символы в нижний регистр. Результат выводится.

Вот другое решение, с использованием только строковых операций с двойными кавычками:

while (О) {

print "\u\L$_";

}

Если вы самостоятельно нашли это решение, поставьте себе дополнительно пять баллов.









Начало  Назад  Вперед