【问题标题】:How to truncate a string to a specific length in perl?如何在perl中将字符串截断为特定长度?
【发布时间】:2013-01-21 15:10:11
【问题描述】:

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

更新:

输入:$str = "abcd";

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

【问题讨论】:

  • 您能否提供一个示例输入/输出以更清楚地说明?
  • 不值得为此做出专门的回答,但是...如果您要截断带有整数的十六进制表示的printf 语句,则使用位移比substr 效果更好:@987654325 @

标签: perl


【解决方案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 转义可以替换为后向断言或简单捕获:

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

【讨论】:

  • 感兴趣的人请注意:在 perl v5.20(至少)中,lookbehind 断言的长度限制为 255。
【解决方案3】:

还需要提及的是,您可以使用printfsprintf,而不是substr() 或正则表达式。

perldoc -f sprintf

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

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

【讨论】:

    【解决方案4】:

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

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

    可能需要检查字符串的初始长度,如果它小于 3 个字符,则无法将这个调用的返回值分配给substr(更多信息请参阅perldoc -f substr)并试图这样做会导致错误。

    【讨论】:

      【解决方案5】:

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

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

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

      print substr $string, 0, 50;
      

      【讨论】:

        【解决方案6】:

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

        #!/usr/bin/perl -w
        
        use strict;
        
        my $str = "abcd";
        
        $str =~ /(\w{0,3})/;
        print $1;
        

        【讨论】:

          【解决方案7】:

          最自然的方法是使用 substr 来提取你想要的部分:

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

          如果您只想修改字符串并且您确定它至少是所需的长度:

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

          如果你不确定,你可以这样做:

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

          或捕获异常:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-02-21
            • 2017-08-23
            • 1970-01-01
            • 2015-03-12
            • 2021-05-09
            • 1970-01-01
            • 2011-11-30
            相关资源
            最近更新 更多