Подтвердить что ты не робот

Как усечь строку до определенной длины в perl?

Я просто не могу найти "обрезать строку до определенной длины" в Perl. Есть ли встроенный способ?

UPDATE:

input: $str = "abcd";

вывод (усечение для 3 символов): $str is abc

4b9b3361

Ответ 1

Вы хотите использовать функцию substr().

$shortened = substr( $long, 0, 50 ); # 50 characters long, starting at the beginning.

Для получения более подробной информации используйте perldoc

perldoc -f substr

В вашем случае это будет:

$str = 'abcd';
$short = substr( $str, 0, 3 );

Ответ 2

Для строки произвольной длины, где длина усечения может быть длиннее длины строки, я бы выбрал замену

$str =~ s/.{3}\K.*//s;

Для более коротких строк подстановка не будет соответствовать, и строка не изменится. Удобный побег \K можно заменить на утверждение lookbehind или простой захват:

s/(?<=.{3}).*//s   # lookbehind
s/(.{3}).*/$1/s    # capture

Ответ 3

Пока ваша исходная строка имеет длину не менее 3 символов, вы можете использовать вызов substr как lvalue.

my $str = "abcd";
substr($str, 3) = "";
print "$str\n";   # prints "abc"

Возможно, потребуется проверить начальную длину строки, как если бы она была короче 3 символов, возвращаемое значение этого вызова до substr не может быть назначено (см. perldoc -f substr для получения дополнительной информации) и попыток это приведет к ошибке.

Ответ 4

Если я правильно понял, вам нужно сделать как php wordwrap() строку, так что:

use Text::Format;
print Text::Format->new({columns => 50})->format($string);

Если вам нужны только первые N символов:

print substr $string, 0, 50;

Ответ 5

Или вы можете использовать regexp, чтобы сделать то же самое.

#!/usr/bin/perl -w

use strict;

my $str = "abcd";

$str =~ /(\w{0,3})/;
print $1;

Ответ 6

Самый естественный способ - использовать substr для извлечения желаемой части:

$first_n = substr($string, 0, $n);

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

substr($string, $n) = '';

Если вы не уверены, вы можете сделать:

use List::Util "min";
substr($string, min($n, length($string))) = '';

или поймать исключение:

eval { substr($string, $n) = '' };

Ответ 7

Возможно, полезно также упомянуть, что вместо substr() или регулярных выражений вы могли бы использовать printf или sprintf.

См. perldoc -f sprintf:

Для преобразования строк, задание точности обрезает строку для установите указанную ширину:

  printf '<%.5s>', "truncated";   # prints "<trunc>"
  printf '<%10.5s>', "truncated"; # prints "<     trunc>"