Perl:用于去除字符串前后空格的函数

89

有没有内置的函数可以去除前导和尾随的空格,使得trim(" hello world ") eq "hello world"


4
Perl中的字符串相等性是通过运算符eq进行测试的。 - A. Rex
6
关于您得到的所有答案做些澄清:s/^\s+|\s+$//g;s/^\s*//; s/\s*$//;。后者是(稍微)更符合惯用方式的方法,因为在这种情况下重新启动正则表达式引擎实际上比选择更快。您可以在Jeffrey Friedl的《精通正则表达式》中了解更多信息。(除非在某些新版本的Perl中已经修复了这个问题,否则请有人纠正我!) - Hugmeir
5
作为一个来自Java和.NET背景的人,我几乎惊讶于这不是语言内置的!谢谢大家! - Landon Kuhn
4
@landon9720,有点是这样的:Scalar::Util 模块有 trim 函数,并且自 5.7.3 版本起就是核心模块了——那是在2002年! - Hugmeir
4
Hugmeir,这是错误的,请看Ether的回答 - daxim
1
更多函数的比较:http://www.illusori.co.uk/perl/2010/03/05/advanced_benchmark_analysis_1.html http://blog.stevenlevithan.com/archives/faster-trim-javascript - daxim
10个回答

99

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

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

Perl 6将包括一个trim函数:

$string .= trim;

来源: 维基百科


7
我大约每个月都会查阅这个内容,可惜每次都不能给它点赞。 - kyle

87

使用trim方法可在String::Util库中获得:

编辑说明: String::Util不是核心模块,但您可以通过CPAN安装它,命令为[sudo] cpan String::Util

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

输出:

字符串现在为'hello'

但是你自己也可以很容易地做到:

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

1
@mklement0永远不会这样。但这并不重要,因为每个人都应该使用来自CPAN的模块。 - Ether
3
为什么每个人都应该使用CPAN模块?当你将Perl从Linux发行版(Debian、RedHat、Ubuntu)与手动安装的CPAN模块结合使用时,这会使得一致性很困难。如果能够使用Linux发行版中可用的包作为模块来实现Perl中的某些功能,那就更好了。 - Marki555
1
@Marki555,你的Linux发行版中可用的模块包实际上来自CPAN -- 它们只是被重新打包了。如果某个模块还没有被打包,通常可以请求将其打包(Debian社区非常积极和乐于助人)。 - Ether
3
我知道它们也来自于CPAN......是的,一般来说我可以请求在Debian中添加一个新的包,但这对我已经安装的Debian稳定版本没有帮助......这就是为什么我更喜欢使用打包好的模块,但如果确实需要的话会直接使用CPAN。 - Marki555
5
尊敬的Ether,我很感激了解到这是一个非核心模块。这篇文章讨论了使用一个模块代替一个相当简单的正则表达式一行代码。如果这个模块是核心的,我会更加开放地接受它。在这种情况下,它是相关的。 - UncleCarl
1
我更喜欢使用\s++而不是\s+。因为它不使用回溯,所以它略微更有效率。尽管可以承认的是,只有在你疯狂地调用它时才会有所影响。 - Erik Lievaart

30

没有内置的trim函数,但是你可以通过简单的替换操作轻松实现自己的函数:

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

或使用Perl 5.14及更高版本中的非破坏性替换

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

10

9

4

如果你正在使用 Text::CSV,我发现了这个帖子,然后注意到可以通过开关在 CSV 模块中去除它:

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

逻辑反向,如果想要去除,则需将其设置为1。真是匪夷所思。希望这能对大家有所帮助。


4

有一种选择是Text::Trim

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

3

s/^\s*//; s/\s+$//;应用于它。或者如果你想要更加高级,可以使用s/^\s+|\s+$//g


3
我还使用正向先行断言来修剪文本内部的重复空格:
s/^\s+|\s(?=\s)|\s+$//g

-3
不行,但你可以使用 s/// 替换操作符和 \s 空白断言来获得同样的结果。

这将删除单词之间的空格,而不仅仅是在字符串的两端。 - DarenW
@DarenW:这取决于你如何使用它。 - Philip Potter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接