Анимация
JavaScript
|
Главная Библионтека Если поставить эту прагму в начало файла, то вы больше не сможете использовать переменные (скалярные, массивы и хеши), сначала не "объявив" их. Объявляются они с помощью операции ту () следующим образом: use strict; my $а; # сначала значение undef my @b = qw(fred barney betty); # присвоить начальное значение push @b, qw{wilma); # разве можно забыть про Вильму? @с = sort @b; # НЕ КОМПИЛИРУЕТСЯ Во время компиляции последний оператор будет помечен флагом ошибки, потому что он обратился к переменной, не объявленной ранее с помощью операции ту (т.е. @с). Другими словами, ваша программа даже не начнет работать до тех пор, пока не будут объявлены все используемые переменные. Преимущества принудительного объявления переменных таковы: 1. Ваши программы будут работать несколько быстрее (обращение к переменным, созданным с помощью ту, производится несколько быстрее, чем к обычным переменным).* 2, Гораздо быстрее будут выявляться ошибки набора, потому что вы больше не сможете случайно обратиться к несуществующей переменной $ freed, когда вам будет нужна переменная $fred. По этой причине многие программисты, пишущие на Perl, автоматически начинают каждую новую программу прагмой use strict. Упражнения Ответы к упражнениям даны в приложении А. 1. Напишите подпрограмму, которая будет принимать в качестве аргумента числовое значение от 1 до 9 и возвращать английское название этого числа (т.е. one, two и т.д.). Если значение не принадлежит указанному диапазону, подпрограмма должна возвратить вместо имени исходное число. Проверьте работу подпрограммы, введя какие-нибудь данные. Для вызова этой подпрограммы вам, наверное, придется написать какой-то код. (Совет: эта подпрограмма не должна выполнять никакого ввода-вывода.) 2. Взяв подпрограмму из предыдущего упражнения, напишите программу, которая будет брать два числа и складывать их, выдавая результат в формате Two plus two equals four. (He забудьте начать первое слово с заглавной буквы!) 3. Модернизируйте эту подпрограмму так, чтобы она возвращала названия от negative nine до negative one и zero (т.е. принимала числа из диапазона от -9 до -1 и нуль). Проверьте, как она будет работать в программе из упражнения 2. * "Обычная переменная" в этом случае - переменная пакета (поэтому $х - это, по сути дела, $main: : х). Переменные, созданные с помощью ту {), ни в один пакет не входят. в этой главе: • Оператор last • Оператор next • Оператор redo • Метки • Модификаторы выражений • Операции &S и как управляющие структуры • Упражнения Управляющие структуры Оператор last Выполняя некоторые из предыдущих упражнений, вы, возможно, иногда думали: "Если бы в моем распоряжении был С-оператор break, все было бы нормально". Даже если такая мысль и не приходила вам в голову - все равно позвольте мне рассказать о Perl-операторе для преждевременного выхода из цикла last. Оператор last обеспечивает выход из самого внутреннего блока цикла, в котором расположен этот оператор*, передавая управление оператору, следующему непосредственно за этим блоком. Например: while {что-то) { что-то; что-то; что-то; if (условие) { что-то или другое; что-то или другое; last; # выход из цикла while еще что-то; еще что-то; # last передает управление в эту точку программы Конструкция типа do {) while/until с точки зрения операторов next, last и redo циклом не считается. Если условие истинно, то выполняются строки что-то или другое, после чего оператор last завершает цикл while. Оператор last учитывает только блоки, образующие цикл, а не блоки, необходимые для построения определенных синтаксических конструкций. Это значит, что блоки для операторов if и else, равно как и для конструкций do {} while/until, "не считаются"; учитываются только блоки, которые образуют циклы for, foreach, while, until и "голые" блоки. ("Голый" блок - это блок, не являющийся частью более крупной конструкции, например цикла, подпрограммы, оператора if/then/else.) Допустим, мы хотим посмотреть, было ли почтовое сообщение, сохраненное в файле, послано пользователем merlyn. Такое сообщение могло выглядеть следующим образом: From: raerlyn@stonehenge.com (Randal L. Schwartz) To: stevet{§ora . com Date: Ol-DEC-96 08:16:24 PM -0700 Subject: A sample mail message Heres the body of the mail message. And here is some more. Нам нужно было бы найти в этом сообщении строку, которая начинается словом From:, а затем посмотреть, не содержит ли эта строка регистрационное имя merlyn. Это можно было бы сделать так: while (<STDIN>) { # читать входные строки if (/"From: /) { # начинается ли строка со слова From:? Если да... if (/merlyn/) { # то сообщение от merlyn print "Email from Randal Its about time!\n"; last; # дальше искать строки From: не нужно, поэтому выйти } # конец цикла "if from:" if (/"$/) { # пустая строка? last; # если да, больше отроки не проверять ) # конец цикла while Найдя строку, которая начинается со слова From:, мы выходим из цикла, потому что хотим видеть только первую такую строку. Кроме того, поскольку заголовок почтового сообщения заканчивается на первой пустой строке, мы можем выйти и из основного цикла. 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 |