Анимация
JavaScript
|
Главная Библионтека Напишите программу, которая просматривает файл /etc/passwd (из stdin) на предмет наличия двух пользователей с одинаковыми именами и выводит эти имена. (Совет: после извлечения первого имени создайте хеш с этим именем в качестве ключа и числом его экземпляров в качестве значения. Прочитав последнюю строку stdin, ищите в этом хеше счетчики с показанием больше единицы.) Повторите последнее упражнение, но с выдачей имен всех пользователей, зарегистрировавшихся под одинаковыми именами. (Совет: в хеше вместо числа экземпляров сохраните список регистрационных имен, записанных через пробелы. Затем ищите значения, содержащие пробел.) в этой главе: • Определение пользовательской функции • Вызов пользовательской функции • Возвращаемые значения • Аргументы • Локальные переменные в функциях • Полулокальные переменные, созданные при помощи функции local • Создаваемые операцией ту() переменные файлового уровня • Упражнения Функции Мы уже знакомы со встроенными пользовательскими функциями, например chomp, print и другими, и пользовались ими. Теперь давайте рассмотрим функции, которые вы можете определить сами. Определение пользовательской функции Пользовательская функция, чаще называемая подпрограммой, определяется в Perl-программе с помощью следующей конструкции: sub имя { оператор 1 оператор 2 оператор 3 ) Здесь имя - это имя подпрограммы, которое может быть любым именем вроде тех, которые мы давали скалярным переменным, массивам и хешам. Вновь подчеркнем, что эти имена хранятся в другом пространстве имен, поэтому у вас может быть скалярная переменная $f red, массив @fred, хеш %fred, а теперь и подпрограмма fred*. * Более правильно эту подпрограмму следовало бы назвать sfred, но пользоваться такого рода именами приходится редко Блок операторов, следующий за именем подпрограммы, становится ее определением. Когда эта подпрограмма вызывается, то блок операторов, входящих в нее, выполняется, и вызывающему объекту выдается соответствующее возвращаемое значение (как будет описано ниже). Вот, например, подпрограмма, которая выдает знаменитую фразу: sub say hello ( print "hello, world!\n"; Определения подпрограмм могут стоять в любом месте текста программы (при выполнении они пропускаются), но обычно их размещают в конце файла программы, чтобы основная часть программы находилась в начале. (Если вам часто приходилось писать программы на языке Паскаль, можете по привычке поставить свои подпрограммы в начало, а выполняемые операторы - в конец. Это ваше дело.) Определения подпрограмм глобальны*; локальных подпрограмм не бывает. Если у вас вдруг появились два определения подпрограмм с одинаковым именем, то второе определение заменяет первое без предупреждения**. В теле подпрограммы вы можете обращаться к переменным, используемым в других частях программы {глобальным переменным), и присваивать им значения. По умолчанию любая ссылка на переменную в теле подпрограммы относится к глобальной переменной. Об исключениях из этого правила мы расскажем в разделе "Локальные переменные в функциях". В следующем примере: sub say what ( print "hello, $what\n"; переменная $what является глобальной переменной, которая может использоваться также и в других частях программы. Вызов пользовательской функции Для вызова подпрограммы из любого выражения необходимо поставить после ее имени круглые скобки, например: say hello(); # простое выражение $а = 3 + say hello() # часть более сложного выражения for ($х = start value(); $х < end value() ; $х += increment()) ( ) # вызов трех подпрограмм для определения значений * Точнее, глобальны для текущего пакета, но поскольку в этой книге отдельные пакеты не рассматриваются, вы можете считать определения подпрограмм глобальными для всей программы. Если только вы не выполняете программу с ключом -w. 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 |