Анимация
JavaScript


Главная  Библионтека 

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

в этой главе:

• Поиск подотрШи

• Извлечение и замена подстроки

• Форматирование данных с помощью функции sprintfO

• Сортировка по заданным критериям ..

• Транслитерация

• Упражнения


Другие операции преобразования данных

Поиск подстроки

Успех поиска подстроки зависит от того, где вы ее потеряли. Если вы потеряли ее в большей строке - вам повезло, потому что в таком случае может помочь операция index. Вот как ею можно воспользоваться:

$х = index($сгрока, $полсгрока)

Perl находит первый экземпляр указанной подстроки в заданной строке и возвращает целочисленный индекс первого символа. Возвращаемый индекс отсчитывается от нуля, т.е. если подстрока найдена в начале указанной строки, вы получаете 0. Если она найдена на символ дальше, вы получаете 1 и т.д. Если в указанной строке нет подстроки, вы получаете -1.

Вот несколько примеров:

$where = index("hello", "е") ;

$person = "barney";

$where = index("fred barney",$person) ;

$rockers = ("fred","barney");

$where = index(join (" ",Srockers),$person); # то же самое

# $where получает 1

# $where получает 5

Отметим, что и строка, в которой производится поиск, и строка, которая ищется, может быть литеральной строкой, скалярной переменной, содержащей строку, и даже выражением, которое имеет строковое значение. Вот еще несколько примеров:



$which = indexCa very long string", "long") ; # $which получает 7 $which = index("a very long string", "lame") ; # $wliich получает -1

Если строка содержит искомую подстроку в нескольких местах, то функция index возвращает первый относительно начала строки индекс. Чтобы найти другие экземпляры подстроки, можно указать для этой функции третий параметр - минимальное значение позиции, которое она будет возвращать при поиске экземпляра подстроки. Выглядит это так:

$х = index {$большая строка, маленькая строка, пропуск)

Вот несколько примеров того, как работает этот третий параметр:

$where = index ("liello world", "1") ; # возвращает 2 (первая буква 1)

$where = index("hello world","1",О); # то же самое

$where = index("hello world","1",1); # опять то же самое

$where = index("hello world","1",3); # теперь возвращает 3

# (3 - первая позиция, которая больще или равна 3)

$where = index("hello world","о",5); # возвращает 7 (вторая о)

$where = index("hello world","о",8); # возвращает -1 (ни одной после 8)

Вы можете пойти другим путем и просматривать строку справа налево с помощью функции rindex, чтобы получить правый крайний экземпляр. Эта функция тоже возвращает количество символов между левым концом строки и началом подстроки, как и раньще, но вы получите крайний правый экземпляр, а не первый слева, если их несколько. Функция rindex тоже принимает третий параметр, как и функция index, чтобы вы могли получить целочисленный индекс первого символа экземпляра подстроки, который меньше или равен адресу выбранной позиции. Вот несколько примеров того, что можно таким образом получить:

$w = rindex("hello world","he"); # $w принимает значение О

$w = rindex("hello world","1"); # $w принимает значение 9 (крайняя правая 1)

$w = rindex("hello world","о"); # $w принимает значение 7

$w = rindex("hello world","o "); # теперь $w принимает значение 4

$w = rindex("hello world","xx"); # $w принимает значение -1 (не найдена)

$w = rindex("hello world","о",6); # $w принимает значение 4 (первая до 6)

$w = rindex ("hello world", "о", 3) ; # $w принимает значение -1 (не найдена до 3)

Извлечение и замена подстроки

Извлечь фрагмент строки можно путем осторожного применения регулярных выражений, но если этот фрагмент всегда находится на известной позиции, такой метод неэффективен. В этом случае удобнее использовать функцию substr. Эта функция принимает три аргумента: строковое значение, начальную позицию (определяемую так же, как в функции index) и длину, т.е.

$s = substr ($строка, $начало, $ллина) ;



Начальная позиция определяется так же, как в функции index: первый символ - нуль, второй символ - единица и т.д. Длина - это число символов, которые необходимо извлечь, начиная от данной позиции: нулевая длина означает, что символы не извлекаются, единица означает получение первого символа, двойка - двух символов и т.д. (Больше символов, чем имеется в строке, извлечь нельзя, поэтому если вы запросите слишком много, ничего страшного не произойдет.) Выглядит это так:

$hello = "hello, world";

$grab = substr($hello, 3, 2); # $grab получает "lo"

$grab = substr($hello, 7, 100); # 7 до конца, или "world!"

Можно даже выполнять подобным образом операцию "десять в степени п" для небольших целочисленных степеней, например:

$big = substr("10000000000",О,$power+l); # 10 ** $power

Если количество символов равно нулю, то возврашается пустая строка. Если либо начальная, либо конечная позиция меньше нуля, то такая позиция отсчитывается на соответствующее число символов, начиная с конца строки. Так, начальная позиция -1 и длина 1 (или более) дает последний символ. Аналогичным образом начальная позиция -2 отсчитывается от второго символа относительно конца строки:

$stuff = substr("a very long string",-3,3); # последние три символа $stuff = substr("а very long string",-3,1); # буква i

Если начальная позиция указана так, что находится "левее" начала строки (например, задана большим отрицательным числом, превышающим длину строки), то в качестве начальной позиции берется начало строки (как если бы вы указали начальную позицию 0). Если начальная позиция - большое положительное число, то всегда возвращается пустая строка. Другими словами, эта функция всегда возвращает нечто, отличное от сообшения об ошибке.

Отсутствие аргумента "длина" эквивалентно взятию в качестве этого аргумента большого числа - в этом случае извлекается все от выбранной позиции до конца строки*.

Если первый аргумент функции substr - скалярная переменная (другими словами, она может стоять в левой части операции присваивания), то сама эта функция может стоять в левой части операции присваивания. Если вы перешли к программированию на Perl из С, вам это может показаться странным, но для тех, кто когда-нибудь имел дело с некоторыми диалектами Basic, это вполне нормально.

в очень старых версиях Perl пропуск третьего аргумента не допускался, поэтому первые Perl-программисты использовали в качестве этого аргумента большие числа Вы, возможно, столкнетесь с этим в своих археологических исследованиях программ, написанных Perl.



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