Вложенные (рекурсивные) функции
Функции могут вызывать сами себя, углубляясь на несколько уровней. На сколько - это зависит от конкретной реализации Perl, от конкретной аппаратной части и от конфигурации. Обычно, вам хватит ресурсов вашей машины, и беспокоиться об этом не стоит. Но если вам интересно, вы можете попробовать запустить вот такую программу:
firstSub();
sub firstSub{
print("$count\n");
$count++;
firstSub();
}
Программа напечатает:
Error: Runtime exception
Перед тем, как напечатать это сообшение об ошибке, программа будет увеличивать значение переменной $count до тех пор, пока будет возможен рекурсивный вызов функции. Таким образом, по значению переменной $count вы можете узнать, сколько уровней рекурсивных вызовов допускает ваша система.
Но не увлекайтесь рекурсией - этим стоит заниматься вплотную в особенных случаях, например, при некоторых математических рассчетах.
Частные функции.
Вам может потребоваться использовать функцию с ограниченной областью действия. Как это устраивать с переменными, мы уже разобрались. Вот как это реализуется в случае с функциями:
$temp = performCalc(10, 10);
print("temp = $temp\n");
sub performCalc {
my ($firstVar, $secondVar) = @_;
my $square = sub {
return($_[0] ** 2);
};
return(&$square($firstVar) + &$square($secondVar));
};
Программа напечатает:
temp = 200
Как вы видите, у нас имеется функция $square. Точнее, $square - это обычная скалярная переменная, ссылающаяся на функцию. Для обращения к функции мы используем знак & перед именем переменной $square. Эту функцию мы можем использовать только внутри функции performCalc() - она недоступна для остальной программы.
|
|
Строковые функции
Сейчас мы рассмотрим строковые функции. С помощью этих функций вы можете определить длину строки, произвести поиск подстроки или поменять местами символы в строке. Ниже приведены строковые функции, имеющиеся в Perl:
chomp (string), chomp (array) использует значение специальной переменной $/ для последнего символа строки string или каждого элемента массива array. Последний символ будет удален только в том случае, если он равен значению переменой $/.
chop (string), chop (array) делает то же самое, что и предыдущая функция, но в качестве результата эта функция возвращает сам удаленный символ.
chr (number) возвращает символ из ASCII-таблицы с кодом number. Например, chr(65) возвратит символ 'A'.
crypt (string1, string2) шифрует строку string1. Perl не предоставляет механизмов для дешифрования строки.
index (string, substring, position) возвращает позицию первого вхождения строки substring в строке string считая от позиции position. Если параметр position не задан, то сравнение строк ведется от начала строки string.
join (string, array) возвращает строку, в которой все элементы массива array соединены строкой string. Например, join (">>", ("a","b","c")) возвратит строку "a>>b>>c";
|
|
lc (string) возвратит строку, где все символы прописные. Например, lc ("ABCD") возвратит "abcd"
lcfirst (string) возвратит строку, в которой только первый символ прописной. Например, lcfirst ("ABCD") возвратит "aBCD"
length (string) возвращает длину строки.
rindex (string, substring, position) то же, что и index (смотрите выше), но возвращает позицию последнего вхождения.
split (pattern, string, limit) разбивает строку string на части, принимая за границу значение параметра pattern. Например, ($a, $b, $c) = split ("::", "1::2::3") присвоит переменным $a, $b, $c значения "1", "2", "3" соответственно. Если же результат используется в скалярном контексте, то функция возвращает количество найденных таким образом элементов.
substr (string, offset, length) возвращает часть строки string, как определено параметрами offset (смещение) и length (длина). Если length не указан, возвращается все, что находится на промежутке от offset до конца string. Отрицательные значения offset могут использоваться для сканирования с правого края строки string.
uc (string) то же самое, что и lc (смотрите выше), но все символы заглавные.
ucfirst (string) то же самое, что lcfirst (смотрите выше), но символ заглавный.
В случае, если Perl встречает число там, где ожидает встретить строку, он просто преобразовывает число в строку, освобождая вас от дополнительной работы.
|
|
Некоторые функции из приведенных выше используют для своей работы специальную переменную $_, о которой вы узнаете в главе 9 "Файлы" и главе 12 "Использование специальных переменных".
Следующие несколько примеров демонстрируют применение некоторых строковых функций. После того, как вы поймете работу нескольких строковых функций, вы сможете правильно применять и остальные.
Пример: изменение значения строки
Очень часто вам, возможно, понадобится изменять части строк - как правило, где-то в середине строки. Когда перед вами станет такая задача, вы можете воспользоваться функцией substr(). Обычно эта функция используется для получения строки из существующей строки - на основании трех параметров - исходной строки, смещения, которое есть начало новой строки и длины новой строки.
$firstVar = substr("0123BBB789", 4, 3);
print("firstVar = $firstVar\n");
Программа напечатает:
firstVar = BBB
Функция возвратит строку, начиная с 5-го символа, и длиной в 3 символа.
Применение данной функции становится гораздо более интересным, когда вы используете ее слева от оператора присваивания:
$firstVar = "0123BBB789";
substr($firstVar, 4, 3) = "AAA";
print("firstVar = $firstVar\n");
|
|
Программа напечатает:
firstVar = 0123AAA789
Пример: поиск строки
Другая интересная задача, которую вы можете решить с помощью строковх функций - это поиск заданной подстроки в строке. Например, у вас есть полное имя файла, включая путь: "C:\\WINDOWS \\TEMP\\WSREWE.DAT", а вам нужно получить из него только имя файла. Вы можете это сделать, найдя последний обратный слеш (символ '\'), а за тем применив функцию substr().
Помните, что в строке для указания символа '\' вы должны использовать двойной символ '\\'. Если вы подзабыли материал, обратитесь к главе 2 "Числовые и стринговые литералы".
$pathName = "C:\\WINDOWS\\TEMP\\WSREWE.DAT";
$position = rindex($pathName, "\\") + 1;
$fileName = substr($pathName, $position);
print("$fileName\n");
Программа напечатает:
WSREWE.DAT
Мы не указали здесь третий параметр функции substr() - length, - это потому что нам нужно взять подстроку до конца исходной строки.
Дата добавления: 2018-04-04; просмотров: 366; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!