Глава 15: Другие операции преобразования данных.
15.2 Извлечение и замена подстроки
Извлечь фрагмент строки можно путем осторожного применения регулярних виражений, но если этот фрагмент всегда находится на известной позиции, такой метод неэффективен. В этом случае удобнее использовать функцию substr. эта функция принимает три аргумента: строковое значение, начальную позицию (определяемую так же, как в функции index) и длину, т.е.
$s = substr ($строка, $начало, $длина) ;
Начальная позиция определяется так же, как в функции index: первый символ — нуль, второй символ — единица и т.д. Длина — это число символов, которые необходимо извлечь, начиная от данной позиции: нулевая длина означает, что символы не извлекаются, единица означает получение первого символа, двойка — двух символов и т.д. (Больше символов, чем имеется в строке, извлечь нельзя, поэтому если вы запросите слишком много, ничего страшного не произойдет.) Выглядит это так:
$hello = "hello, world!";
$grab = substr($hello,3,2); # $grab получает "lo"
$grab = substr($hello,7,100); # 7 до конца, или "world!"
Можно даже выполнять подобным образом операцию "десять в степени n" для небольших целочисленньк степеней, например:
$big = substr("10000000000",0,$power+l); # 10 ** $power
Если количество символов равно нулю, то возвращается пустая строка. Если либо начальная, либо конечная позиция меньше нуля, то такая позиция отсчитывается на соответствующее число символов, начиная с конца строки. Так, начальная позиция -їй длина 1 (или более) дает последний символ. Аналогичным образом начальная позиция -2 отсчитывается от второго символа относительно конца строки:
$stuff = substr("a very long string",-3,3); # последние три символа
$stuff = substr("a very long string",-3,1); # буква і
Если начальная позиция указана так, что находится "левее" начала строки (например, задана большим отрицательным числом, превышающим длину строки), то в качестве начальной позиции берется начало строки (как если бы вы указали начальную позицию 0). Если начальная позиция — большое положительное число, то всегда возвращается пустая строка. Другими словами, эта функция всегда возвращает нечто, отличное от сообщения об ошибке.
Отсутствие аргумента "длина" зквивалентно взятию в качестве этого аргумента большого числа — в этом случае извлекается все от выбранной позиции до конца строки*.
* В очень старых версиях Perl пропуск третього аргумента не допускался, поэтому первые Perl-программисты использовали в качестве этого аргумента большие числа. Вы, возможно, столкнетесь с этим в своих археологических исследованиях программ, написанньк Perl.
Если первый аргумент функции substr — скалярная переменная (другими словами, она может стоять в левой части операции присваивания), то сама эта функция может стоять в левой части операции присваивания. Если вы перешли к программированию на Perl из С, вам это может показаться странным, но для тех, кто когда-нибудь имел дело с некоторыми диалектами Basic, это вполне нормально. В результате такого присваивания изменяется та часть строки, которая была бы возвращена, будь substr использована не в левой, а в правой части выражения. Нопример, substr ($var,3,2) возвращает четвертый и пятый символы (начиная с 3 в количестве 2), поэтому присваивание изменяет указанные два символа в $var подобно тому, как это приведено ниже:
$hw = "hello world!";
substr($hw,0,5) = "howdy"; # $hw теперь равна "howdy world!"
Длина заменяющего текста (который присваивается функции substr) не обязательно должна быть равна длине заменяемого текста, как в этом примере. Строка автоматически увеличивается или уменьшается в соответствии с длиной текста. Вот пример, в котором строка укорачивается:
$hw = "hello world!";
substr($hw, 0, 5) = "hi"; # $hw теперь равна "hi world!"
В следующем примере эта строка удлиняется:
$hw = "hello world!";
substr($hw, -б, 5) = "nationwide news"; # заменяет "world"
Процедуры укорачивания и удлинения заменяемой строки выполняются д остаточно быстро, поэтому не бойтесь их использовать — хотя лучше все же заменять строку строкой той же длины.
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|