Я просто не могу найти "обрезать строку до определенной длины" в Perl. Есть ли встроенный способ?
UPDATE:
input: $str = "abcd";
вывод (усечение для 3 символов): $str is abc
Я просто не могу найти "обрезать строку до определенной длины" в Perl. Есть ли встроенный способ?
UPDATE:
input: $str = "abcd";
вывод (усечение для 3 символов): $str is abc
Вы хотите использовать функцию substr()
.
$shortened = substr( $long, 0, 50 ); # 50 characters long, starting at the beginning.
Для получения более подробной информации используйте perldoc
perldoc -f substr
В вашем случае это будет:
$str = 'abcd';
$short = substr( $str, 0, 3 );
Для строки произвольной длины, где длина усечения может быть длиннее длины строки, я бы выбрал замену
$str =~ s/.{3}\K.*//s;
Для более коротких строк подстановка не будет соответствовать, и строка не изменится. Удобный побег \K
можно заменить на утверждение lookbehind или простой захват:
s/(?<=.{3}).*//s # lookbehind
s/(.{3}).*/$1/s # capture
Пока ваша исходная строка имеет длину не менее 3 символов, вы можете использовать вызов substr
как lvalue.
my $str = "abcd";
substr($str, 3) = "";
print "$str\n"; # prints "abc"
Возможно, потребуется проверить начальную длину строки, как если бы она была короче 3 символов, возвращаемое значение этого вызова до substr
не может быть назначено (см. perldoc -f substr
для получения дополнительной информации) и попыток это приведет к ошибке.
Если я правильно понял, вам нужно сделать как php
wordwrap()
строку, так что:
use Text::Format;
print Text::Format->new({columns => 50})->format($string);
Если вам нужны только первые N символов:
print substr $string, 0, 50;
Или вы можете использовать regexp, чтобы сделать то же самое.
#!/usr/bin/perl -w
use strict;
my $str = "abcd";
$str =~ /(\w{0,3})/;
print $1;
Самый естественный способ - использовать substr для извлечения желаемой части:
$first_n = substr($string, 0, $n);
Если вы хотите изменить строку, и вы уверены, что она имеет хотя бы желаемую длину:
substr($string, $n) = '';
Если вы не уверены, вы можете сделать:
use List::Util "min";
substr($string, min($n, length($string))) = '';
или поймать исключение:
eval { substr($string, $n) = '' };
Возможно, полезно также упомянуть, что вместо substr()
или регулярных выражений вы могли бы использовать printf
или sprintf
.
См. perldoc -f sprintf
:
Для преобразования строк, задание точности обрезает строку для установите указанную ширину:
printf '<%.5s>', "truncated"; # prints "<trunc>" printf '<%10.5s>', "truncated"; # prints "< trunc>"