商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > Perl删除前导和拖尾空白(删除左右空格、空白字符)

Perl删除前导和拖尾空白(删除左右空格、空白字符)

  发布于2026-06-29 阅读(0)

扫一扫,手机访问

很多编程语言都内置了 ltrimrtrimtrim 函数,专门用来去掉字符串两头的空白字符。但 Perl 偏偏没有——因为正则表达式太直接了,一行替换就能搞定。实际上,这个需求简单到成了帕金森琐碎定理里常被拿来举例的话题。当然,CPAN 上也有不少模块封装了这些功能,不过自己写起来也不费事。

Perl删除前导和拖尾空白(删除左右空格、空白字符)

左侧整理

ltrim(或者叫 lstrip)从字符串左侧删除空白字符:

复制代码 代码如下:
$str =~ s/^s+//;

从字符串开头 ^ 开始匹配一个或多个空白字符(s+),然后替换成空字符串。

右侧整理

rtrim(或者 rstrip)从字符串右侧删除空白字符:

复制代码 代码如下:
$str =~ s/s+$//;

匹配一个或多个空白字符(s+)直到字符串末尾 $,替换为空。

整理两端

trim 同时删除两端空白:

复制代码 代码如下:
$str =~ s/^s+|s+$//g

将上面两个正则用或运算符 | 连起来,加上 /g 修饰符进行全局替换(反复匹配)。

封装在函数里

如果不想每次手写这些正则,可以先把它们打包成子程序:

复制代码 代码如下:
sub ltrim { my $s = shift; $s =~ s/^s+//;      return $s };
sub rtrim { my $s = shift; $s =~ s/s+$//;      return $s };
sub  trim { my $s = shift; $s =~ s/^s+|s+$//g; return $s };

用起来也很直观:

复制代码 代码如下:
my $z = " abc ";
printf "<%s>n", trim($z);  # 
printf "<%s>n", ltrim($z); # 
printf "<%s>n", rtrim($z); # < abc>

String::Util

要是实在不想拷贝那些代码,装个 CPAN 模块也行。比如 String::Util 提供了 trim 函数:

复制代码 代码如下:
use String::Util qw(trim);

my $z = " abc ";
printf "<%s>n", trim( $z );                # 
printf "<%s>n", trim( $z, right => 0 );  # 
printf "<%s>n", trim( $z, left  => 0 );   # < abc>

默认它清理两侧,不需要额外参数。不过个人觉得,自己实现 ltrimrtrim 更清晰,一眼就能知道在做什么。

Text::Trim

另一个模块 Text::Trim 提供了三个函数,但它的设计比较“Perl 风格”——甚至到了有点危险的地步。如果你用返回值(比如赋给变量或在 print 中使用),它会返回整理后的字符串,原变量不变:

复制代码 代码如下:
use Text::Trim qw(trim);

my $z = " abc ";
printf "<%s>n", trim($z);  # 
printf "<%s>n", $z;       # < abc >

但如果你在空白上下文中调用它(即不接收返回值),它就会直接修改参数,行为类似于 chomp

复制代码 代码如下:
use Text::Trim qw(trim);

my $z = " abc ";
trim $z;
printf "<%s>n", $z;      # 

这种写法很简洁,但要注意上下文区别,否则容易出 bug。

本文转载于:https://www.jb51.net/article/67843.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

产品推荐

热门关注