【问题标题】:Perl: function to trim string leading and trailing whitespacePerl:修剪字符串前导和尾随空格的函数
【发布时间】:2011-06-03 15:11:27
【问题描述】:

是否有一个内置函数可以修剪前导和尾随空格,例如 trim(" hello world ") eq "hello world"

【问题讨论】:

  • 仅供参考:Perl 中的字符串相等性由运算符 eq 测试。
  • 对你得到的所有回答做一点澄清:s/^\s+|\s+$//g; vs s/^\s*//; s/\s*$//; 后者是(稍微)更惯用的方法,因为重新启动正则表达式引擎实际上是在这种情况下,比交替更快。您可以在 Jeffrey Friedl 的 Mastering Regular Expressions 中阅读更多相关信息。 (除非这个问题在一些新版本的 Perl 中得到修复,在这种情况下请有人纠正我!)
  • 来自 Java 和 .NET 背景,我几乎感到震惊,这不是语言内置的!谢谢大家!
  • @landon9720,它有点像:Scalar::Util 有修剪,并且是自 5.7.3 以来的核心 - 那是 2002 年!
  • Hugmeir,这是错误的,see the answer of Ether

标签: perl


【解决方案1】:

根据this perlmonk's thread

$string =~ s/^\s+|\s+$//g;

【讨论】:

    【解决方案2】:

    这是使用正则表达式的一种方法:

    $string =~ s/^\s+|\s+$//g ;     # remove both leading and trailing whitespace
    

    Perl 6 将包含一个修剪函数:

    $string .= trim;
    

    来源:Wikipedia

    【讨论】:

    • 我大约每月查看一次。太糟糕了,我不能每次都投票。
    【解决方案3】:

    没有内置的 trim 函数,但您可以使用简单的替换轻松实现自己的函数:

    sub trim {
        (my $s = $_[0]) =~ s/^\s+|\s+$//g;
        return $s;
    }
    

    或在 Perl 5.14 及更高版本中使用 non-destructive substitution

    sub trim {
       return $_[0] =~ s/^\s+|\s+$//rg;
    }
    

    【讨论】:

      【解决方案4】:

      申请:s/^\s*//; s/\s+$//;。或者如果你想花哨,可以使用s/^\s+|\s+$//g

      【讨论】:

        【解决方案5】:

        不,但您可以使用s/// 替换运算符和\s 空白断言来获得相同的结果。

        【讨论】:

        • 这将删除单词之间的空格,而不仅仅是字符串的两端。
        • @DarenW:取决于你如何使用它。
        【解决方案6】:
        【解决方案7】:

        这在String::Util 中可用trim 方法:

        编者注:String::Util 不是核心模块,但可以从CPAN[sudo] cpan String::Util 安装。

        use String::Util 'trim';
        my $str = "  hello  ";
        $str = trim($str);
        print "string is now: '$str'\n";
        

        打印:

        字符串现在是“你好”

        不过自己动手很容易:

        $str =~ s/^\s+//;
        $str =~ s/\s+$//;
        

        【讨论】:

        • @mklement0 也不会。但这无关紧要,因为每个人都应该使用 CPAN 中的模块。
        • 为什么每个人都应该使用 CPAN 中的模块?将 Linux 发行版(debian、redhat、ubuntu)中的 perl 与手动安装的 CPAN 模块结合使用时,一致性会变得很困难。如果可以在 perl 中使用在 linux 发行版中作为包提供的模块来完成某些事情,那就更好了
        • @Marki555 模块在您的 linux 发行版中作为软件包提供 来自 CPAN——它们刚刚被重新打包。如果某个模块尚未打包,您通常可以请求打包(debian 人员响应速度特别快且乐于助人)。
        • 我知道他们也来自 CPAN...是的,通常我可以为 debian 请求一个新的 pkg,但它对我安装的 debian 稳定版本没有帮助...这就是我更喜欢的原因打包模块,但如果确实需要,直接使用 CPAN。
        • @Ether 恕我直言,我非常感谢知道这是一个非核心模块。这篇文章正在讨论使用模块来代替相当简单的正则表达式单行。如果模块是核心,我会更加开放。在这种情况下是相关的。
        【解决方案8】:

        我还使用正向前瞻来修剪文本内的重复空格:

        s/^\s+|\s(?=\s)|\s+$//g
        

        【讨论】:

          【解决方案9】:

          一个选项是Text::Trim:

          use Text::Trim;
          print trim("  example  ");
          

          【讨论】:

            【解决方案10】:

            对于那些使用 Text::CSV 的人,我找到了这个线程,然后在 CSV 模块中注意到您可以通过 switch 将其删除:

            $csv = Text::CSV->new({allow_whitespace => 1});
            

            逻辑是倒退的,如果你想剥离,那么你设置为 1。去图。希望这对任何人都有帮助。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-01-03
              • 2015-08-01
              • 2022-08-14
              • 2013-03-04
              • 1970-01-01
              • 1970-01-01
              • 2014-10-30
              相关资源
              最近更新 更多