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

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>
要是实在不想拷贝那些代码,装个 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>
默认它清理两侧,不需要额外参数。不过个人觉得,自己实现 ltrim 和 rtrim 更清晰,一眼就能知道在做什么。
另一个模块 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。
上一篇:Perl学习笔记之文件操作
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8