Функция index() в Perl

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

Вот пример:

▶ Run
#!/usr/bin/perl

print( index('Hello', 'o') );

Эта программа выведет на экран число 4. Буква 'o' — это пятый символ в строке 'Hello', В языке программирования Perl первый символ в строке имеет номер 0. Поэтому для пятого символа функция index() возвращает число 4

То что первый символ в строке имеет номер 0 совершенно аналогично тому как нумеруются элементы в Perl массиве — первый элемент в массиве имеет номер 0 (но в случае массива есть одна тонкость).

Вот что выведет эта же программа если использовать разные значения для второго аргумента:

  • 'H'0
  • 'e'1
  • 'l'2 — в строке 'Hello' есть две буквы 'l', если функции index() передается два аргумента, то она всегда возвращает число для первого вхождения символа в строку
  • 'o'4
  • 'z'-1 — буквы 'z' в строке нет, в таком случае функция возвращает специальное значение число -1
  • 'h'-1 — функция index() регистрозависима. В строке есть буква 'H' в верхнем регистре, но нет буквы 'h' в нижнем регистре, поэтому для 'h' функция возвращает специальное значение -1 — не найдено
  • 'Hello'0 — строка 'Hello' входит в строку 'Hello' начиная с первого символа, первый символ имеет номер 0, что и возвращает функция
  • 'el'1 — строка 'el' входит в строку 'Hello' начиная со второго символа
  • 'asdf'-1 — эта строка не является частью строки 'Hello'

Аргументы

my $index1 = index($str, $substr);
my $index2 = index($str, $substr, $position);

Функции index() нужно обязательно указать либо два, либо три аргумента. Если не указать ни одного аргумента, или указать только один, то будет ошибка:

Not enough arguments for index at script.pl line 3, near "index() "
Execution of script.pl aborted due to compilation errors.

Если указать более чем 3 аргумента, то будет ошибка:

Too many arguments for index at script.pl line 3, near "'a') "
Execution of script.pl aborted due to compilation errors.

Первый и второй аргумент Perl воспринимает как строки. Если есть третий аргумент, то он воспринимается как число.

Функция index() ищет строку которая содержится во втором аргументе в строке, которая содержится в первом аргументе начиная с позиции указанной в третьем аргументе (или с начала строки, если третий аргумент не указан).

Возвращаемое значение

Результат работы функции index() — это всегда целое число.

  • Если число положительное или 0, это означает что строка из второго аргумента является частью строки из первого аргумента. Значение означает позицию в первой строке с которой началось совпадение. Поиск происходит с начала строки если третий аргумент не указан, либо с позиции указанной в третьем аргументе.
  • Число -1 означает что подстрока в строке отсутствует

Если не использовать возвращаемое значение и в Perl скрипте есть use warnings;, то на экран будет выведено предупреждение:

Useless use of index in void context at script.pl line 6.

Например, такое предупреждение выдаст следующая программа:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

index('Hello', 'o');

Пример использования index() с тремя аргументами

Вот пример программы. Тут используется функция index() для того чтобы найти подстроку 'Ab' в строке в которой эта подстрока встречается два раза. Если функции index() не передать третий аргумент, то это то же самое как если передать число 0 в качестве третьего аргумента.

▶ Run
#!/usr/bin/perl

print( index('00 Ab Ab', 'Ab', 0) );

Программа выведет на экран число 3 — это означает что подстрока 'Ab' находится в строке начиная с четвертого символа.

А вот программа которая отображает результат работы функции index() для разных значений третьего аргумента:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use feature qw(say);

foreach my $position (0..9) {
    say( $position, ' ', index('00 Ab Ab', 'Ab', $position) );
}

Эта программа выведет:

0 3
1 3
2 3
3 3
4 6
5 6
6 6
7 -1
8 -1
9 -1

index() ищет подстроку в строке начиная с позиции которая указана в третьем аргументе. Подстрока 'Ab' встречается в строке два раза. Первый раз начиная с индекса 3, второй раз начиная с индекса 6.

'00 Ab Ab'
 01234567

Официальная документация

Вот вывод команды perldoc -f index:

       index STR,SUBSTR,POSITION
       index STR,SUBSTR
               The index function searches for one string within another, but
               without the wildcard-like behavior of a full regular-expression
               pattern match.  It returns the position of the first occurrence
               of SUBSTR in STR at or after POSITION.  If POSITION is omitted,
               starts searching from the beginning of the string.  POSITION
               before the beginning of the string or after its end is treated
               as if it were the beginning or the end, respectively.  POSITION
               and the return value are based at zero.  If the substring is
               not found, "index" returns -1.

Связанные темы

Другие статьи

Комментарии