Операции с подстроками и функция substr

Функция substr работает с подмножеством символов большей строки. Синтаксис вызова выглядит так:

$part = substr($string, $initial_position, $length);

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

my $mineral = substr("Fred J. Flintstone", 8, 5); # "Flint"
my $rock = substr "Fred J. Flintstone", 13, 1000; # "stone"

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

my $pebble = substr "Fred J. Flintstone", 13; # "stone"

Начальная позиция подстроки может задаваться отрицательным числом; в этом случае она отсчитывается от конца строки (то есть позиция –1 соответствует последнему символу). В следующем примере позиция –3 соответствует трем символам от конца строки, то есть букве i:

my $out = substr("some very long string", -3, 2); # $out присваивается "in"

Как и следовало ожидать, index и substr удобно использовать совместно.


В этом примере из строки извлекается подстрока, начинающаяся с позиции буквы l:

my $long = "some very very long string";
my $right = substr($long, index($long, "l") );

А теперь самое интересное: если строка хранится в переменной2, выбранную часть строки можно изменить:

my $string = "Hello, world!";
substr($string, 0, 5) = "Goodbye"; # $string содержит "Goodbye, world!"

Как видите, присваиваемая (под)строка не обязана совпадать по длине с заменяемой подстрокой. Длина полученной строки изменяется в соответствии с длиной замены. А если и это не произвело на вас впечатление, оператор привязки (=~) позволяет ограничить операцию частью строки. В следующем примере подстрока fred заменяется подстрокой barney в пределах 20 последних символов:

substr($string, -20) =~ s/fred/barney/g;

По правде говоря, нам никогда не приходилось использовать эти возможности в своем коде. Скорее всего, вам они тоже не понадобятся. Но всегда приятно сознавать, что Perl может сделать больше, чем вам когда-либо понадобится, не так ли? Почте все, что могут сделать substr и index, также можно сделать с использованием регулярных выражений.


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

my $previous_value = substr($string, 0, 5, "Goodbye");

Функция возвращает предыдущее значение, хотя вы, как обычно, можете использовать эту функцию в пустом контексте, если результат вас не интересует.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Использование функции sprintf для вывода денежных сумм
Поиск подстроки по индексу
Расширенная сортировка
Сортировка по нескольким ключам
Сортировка хеша по значениям

Вернуться в раздел: Perl / 13. Строки и сортировка