Анимация
JavaScript
|
Главная Библионтека с помощью оператора 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 |