Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 [ 87 ] 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103

с помощью оператора if мы определяем, принадлежит ли значение заданному диапазону, отыскивая это число в хеще: если в хеще имеется соответствующий элемент, проверка дает значение "истина", и данный элемент, являющийся соответствующим именем числительным, возвращается. Если соответствующего элемента нет (например, когда $num равно 11 или -4), то поиск в хеще возвращает значение undef и выполняется ветвь else оператора if, возвращая исходное число. Весь цикл, задаваемый оператором if, можно заменить одним выражением:

ScardjmapI$num) 1 $num;

Если значение слева от истинно, то это - значение всего выражения, которое затем и возвращается. Если оно ложно (например, когда значение переменной $num выпадает из диапазона), то вычисляется правая часть операции , возвращая значение $num.

Подпрограмма-драйвер последовательно получает строки, отсекает символы новой строки и передает их по одной в программу 5card, выводя результат.

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

sub card ( ...; ) # из предыдущего ответа

print "Enter first number: ";

chomp(Sfirst = <STDIN>);

print "Enter second number: ";

chomp($second = <STDIN>);

Smessage = card($first) . " plus " .

card($second) . " equals " .

card($first+$second) . ".\n"; print "\u$message";

Первые два оператора print приглашают ввести два числа, а операторы, следующие сразу же за ними, считывают эти значения в $ first и $second.

Затем путем троекратного вызова scard - по одному разу для каждого значения и один раз для суммы - формируется строка $message.

После формирования сообщения его первый символ с помощью операции \и переводится в верхний регистр. Затем сообщение выводится на экран.

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

sub card (

my %card map; @card map0..9) = qw(

zero one two three four five six seven eight nine

my($num) = @ ; my($negative);



if ($num < 0) (

$negative = "negative "; $num = - $num;

if ($card map($num)) (

return $negative . $card mapI$num}; 1 else (

return $negative . $num;

Здесь мы объявили массив %card inap, чтобы обнулить его значения.

Первый оператор i f инвертирует знак переменной $ num и присваивает переменной $negative в качестве значения слово negative, если задаваемое в качестве аргумента число меньше нуля. После действия оператора if значение $num всегда неотрицательное, но при этом в переменную $negative записывается строка negative, которая в дальнейшем используется как префикс.

Второй оператор i f определяет, находится ли значение переменной $num (теперь положительное) в хеше. Если да, то полученное в результате значение хеша присоединяется к префиксу, который хранится в $ negative, и возвращается. Если нет, то значение, содержащееся в $negative, присоединяется к исходному числу.

Последний оператор i f можно заменить выражением:

$negative . ($card map($num) $num);

Глава 9 "Разнообразные управляющие структуры "

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

sub card {) # из предьшущего упражнения

while О { ## НОВОЕ ##

print "Enter first number: ";

chomp($first = <STDIN>);

last if $first eq "end"; ## НОВОЕ ##

print "Enter second number: ";

chomp($second = <STDIN>);

last If Ssecond eq "end"; ## НОВОЕ ##

Smessage = &card($first) . " plus " . card(Ssecond) . " equals " . card(Sfirst+Ssecond) . ".\n"; print "\u$message"; ) ## НОВОЕ ##

Обратите внимание на появление цикла while и двух операций last. Вот так-то!



Глава 10 Дескрипторы файлов и проверка файлов

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

print "What file? ";

chomp($filename = <STDIN>);

open(THATFILE, "$filename") I I

die "cannot open $filename: $"; while {<THATFILE>) {

print "$filename: $ "; # предполагается, что S заканчивается \n

В первых двух строках дается приглашение ввести имя файла, который затем открывается с дескриптором thatfile. Содержимое этого файла считывается с помощью дескриптора и выводится в stdout.

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

print "Input file name: "; chomp($infilename = <STDIN>); print "Output file name: "; chomp(Soutfilename = <STDIN>); print "Search string: "; chomp(Ssearch = <STDIN>); print "Replacement string: "; chomp($replace = <STDIN>); open(IN,$infilename)

die "cannot open $infilename for reading; $"; ## необязательная проверка существования файла ## $outfilename

die "will not overwrite $outfilename" if -e $outfilename; open(0UT,"$outfilename")

die "cannot create $outfilename: $"; while (<IN>) { # читать строку из файла IN в $

s/$search/Sreplace/g; # change the lines

print OUT $ ; # вывести эту строку в файл OUT

close(IN); close(OUT) ;

Эта программа основана на программе копирования файлов, описанной выше в этой главе. К новым особенностям здесь относятся приглашение вводить строки и команда подстановки в середине цикла while, а также проверка возможности уничтожения уже существующего файла.

Обратите внимание на то, что обратные ссылки в регулярном выражении работают, а вот обращение к памяти в заменяющей строке - нет.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 [ 87 ] 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103