Perl的多功能split函数
我爱Perl的split函数。它的功能远比它的弱小的表亲join强大,split具有一些应该成为任何Perl程序员工具箱中常规功能的奇妙特性。让我们看看一些例子。
将句子拆分为单词
要将句子拆分为单词,你可能考虑使用一个空白正则表达式模式,如/\s+/
,它在连续的空白处拆分。split将忽略尾随空白,但如果输入字符串有前导空白怎么办?更好的选择是使用单个空格字符串:' '
。这是一个特殊情况,Perl模仿awk,将所有连续的空白都拆分,并修剪任何前导或尾随空白。
my @words = split ' ', $sentence;
或者遍历每个单词并执行一些操作
use 5.010;
say for (split ' ', ' 12 Angry Men ');
# 12
# Angry
# Men
单个空格模式也是split的默认模式,它默认作用于$_
。这可能导致一些非常简约的代码。例如,如果需要将列表中的每个全名拆分并对其进行一些操作
for (@full_names)
{
for (split)
{
# do something
}
}
谁说Perl看起来像行噪声呢?
创建一个字符数组
要将单词拆分为单独的字母,只需将一个空正则表达式//
传递给split即可
my @letters = split //, $word;
解析URL或文件路径
在解析字符串时,人们可能会想用正则表达式,但对于URL或文件路径来说,split通常工作得更好。例如,如果你想从一个文件路径中获取父目录
my @directories = split '/', '/home/user/documents/business_plan.ods';
my $parent_directory = $directories[-2];
在这里,我使用斜杠拆分文件路径,并使用负索引-2
来获取父目录。文件路径的挑战在于它们的深度可以是n,但文件的父目录将是文件路径中的最后一个元素,因此split工作得很好。
从分隔文件中提取仅前几列
你有多少次解析了逗号分隔的文件,但不想获取文件中的所有列?假设你只想从文件中获取前3列,你可能这样做
while <$read_file>
{
my @columns = split /,/;
my $name = $columns[0];
my $email = $columns[1];
my $account = $columns[2];
...
}
这很好,但split可以根据需要返回有限数量的结果
while <$read_file>
{
my ($name, $email, $account) = split /,/;
...
}
或者重新回顾一个早期的例子,按空白拆分
for (@full_names)
{
my ($firstname, $lastname) = split;
...
}
结论
这些只是Perl多功能split
函数的几个示例。请访问在线官方文档或通过终端使用$ perldoc -f split
。
本文最初发布于PerlTricks.com。
标签
反馈
这篇文章有什么问题吗?请在GitHub上打开一个问题或拉取请求,帮助我们。