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

标签

David Farrell

David是一位专业程序员,他经常推文博客关于代码和编程的艺术。

浏览他们的文章

反馈

这篇文章有什么问题吗?请在GitHub上打开一个问题或拉取请求,帮助我们。