31

我只是无法在 Perl 中找到“将字符串截断为特定长度”。有内置的方法吗?

更新:

输入: $str = "abcd";

输出(截断 3 个字符): $str 是abc

4

7 回答 7

43

您想使用该substr()功能。

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

更多信息,请使用perldoc

perldoc -f substr

在您的情况下,它将是:

$str = 'abcd';
$short = substr( $str, 0, 3 );
于 2013-01-21T15:13:51.787 回答
10

对于任意长度的字符串,其中截断长度可以长于字符串长度,我会选择替换

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

对于较短的字符串,替换将不匹配并且字符串将保持不变。方便的\K转义可以替换为后向断言或简单的捕获:

s/(?<=.{3}).*//s   # lookbehind
s/(.{3}).*/$1/s    # capture
于 2013-01-21T15:45:45.883 回答
5

还可能有用的是,您可以使用or来代替substr()or 正则表达式。printfsprintf

perldoc -f sprintf

对于字符串转换,指定精度会截断字符串以适合指定的宽度:

  printf '<%.5s>', "truncated";   # prints "<trunc>"
  printf '<%10.5s>', "truncated"; # prints "<     trunc>"
于 2017-01-09T18:29:37.607 回答
4

只要您的原始字符串至少有 3 个字符长,您就可以将调用substr用作左值。

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

可能需要检查字符串的初始长度,如果它短于 3 个字符,substr则无法分配此调用的返回值(perldoc -f substr有关详细信息,请参阅 )并且尝试这样做会导致错误。

于 2013-01-21T15:33:39.553 回答
1

如果我理解正确,你需要像php wordwrap()一个字符串一样,所以:

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

如果您只需要前 N 个字符:

print substr $string, 0, 50;
于 2013-01-21T15:12:47.337 回答
1

或者你可以使用正则表达式来做同样的事情。

#!/usr/bin/perl -w

use strict;

my $str = "abcd";

$str =~ /(\w{0,3})/;
print $1;
于 2013-01-21T15:34:00.303 回答
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) = '' };
于 2013-01-21T17:46:47.410 回答