ZetCode

Perl split 函数

最后修改于 2025 年 4 月 4 日

Perl的split函数使用分隔符将字符串分割成子字符串。它返回一个包含这些子字符串的列表,这些子字符串可以赋给一个数组。

split在解析文本数据方面非常强大,它提供了控制分割行为的选项。它可以将固定字符串或正则表达式用作分隔符。

基本 split 用法

如果不提供模式,最简单的形式默认按空格分割。

basic.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $text = "apple banana cherry";
my @fruits = split ' ', $text;

print "Fruits:\n";
foreach my $fruit (@fruits) {
    print "- $fruit\n";
}

这会将字符串按空格分割成一个数组。每个单词都成为结果数组中的一个元素。

$ ./basic.pl
Fruits:
- apple
- banana
- cherry

按特定字符分割

您可以指定任何单个字符作为分割的分隔符。

delimiter.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $csv = "John,Doe,35,New York";
my @fields = split ',', $csv;

print "Fields:\n";
for my $i (0..$#fields) {
    print "$i: $fields[$i]\n";
}

这会将CSV字符串按逗号分割。每个字段都成为一个单独的数组元素,我们通过索引访问它们。

$ ./delimiter.pl
Fields:
0: John
1: Doe
2: 35
3: New York

限制分割次数

第三个参数控制执行的分割次数。

limit.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $path = "/usr/local/bin/perl";
my @parts = split '/', $path, 3;

print "Path components:\n";
foreach my $part (@parts) {
    print "'$part'\n";
}

这里我们分割一个路径字符串,但将其限制为3个部分。剩余的分隔符保留在最后一个元素中。

$ ./limit.pl
Path components:
''
'usr'
'local/bin/perl'

按正则表达式分割

split可以使用正则表达式模式进行更复杂的分割。

regex.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $text = "apple,banana;cherry|date";
my @fruits = split /[,;|]/, $text;

print "Fruits:\n";
print join("\n", @fruits), "\n";

这会使用字符类按多个分隔符字符中的任何一个进行分割。正则表达式匹配逗号、分号或管道符。

$ ./regex.pl
Fruits:
apple
banana
cherry
date

带捕获组的分割

当使用带有捕获组的正则表达式时,捕获的文本将包含在输出中。

capture.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $text = "appleXbananaYcherry";
my @parts = split /([XY])/, $text;

print "Parts:\n";
print join("|", @parts), "\n";

由于分隔符(X和Y)被捕获,它们也被包含在输出数组中。当您需要保留分隔符时,这种行为非常有用。

$ ./capture.pl
Parts:
apple|X|banana|Y|cherry

分割空字段

默认情况下,split会丢弃末尾的空字段。

empty.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $text = "one,,three,,";
my @default = split ',', $text;
my @keep_all = split ',', $text, -1;

print "Default split: ", scalar @default, " elements\n";
print "Keep empty: ", scalar @keep_all, " elements\n";

使用-1作为限制可以保留所有末尾的空字段。默认行为会从数组末尾删除它们。

$ ./empty.pl
Default split: 3 elements
Keep empty: 5 elements

分割到变量

您可以使用列表上下文将split的结果直接赋给变量。

assign.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $date = "2025-04-04";
my ($year, $month, $day) = split '-', $date;

print "Year: $year\n";
print "Month: $month\n";
print "Day: $day\n";

这会将日期字符串分割,并将每个组件赋给单独的变量。变量的数量必须与分割结果的数量匹配。

$ ./assign.pl
Year: 2025
Month: 04
Day: 04

最佳实践

来源

Perl split 文档

本教程通过实际示例介绍了Perl的split函数,展示了它在常见场景中的用法。

作者

我叫Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。我自2007年以来一直在撰写编程文章。迄今为止,我已撰写了1400多篇文章和8本电子书。我在编程教学方面有十多年的经验。

列出 所有 Perl 教程