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
最佳实践
- 始终检查结果:Split可能会返回意外的空列表。
- 预编译正则表达式:为了在重复分割时提高性能。
- 考虑替代方案:对于CSV,请使用Text::CSV模块。
- 记录复杂的分割:正则表达式模式可能难以理解。
来源
本教程通过实际示例介绍了Perl的split函数,展示了它在常见场景中的用法。
作者
列出 所有 Perl 教程。