Perl substr 函数
最后修改于 2025 年 4 月 4 日
Perl 的 substr
函数用于提取或替换字符串的部分。它是一个功能强大的字符串操作工具,具有多种操作模式。
substr
可以作为左值(可修改)使用,也可以返回一个子字符串。它同时支持正数和负数偏移量,从而实现灵活的字符串访问。
substr 的基本用法
最简单的形式是从指定位置开始,提取指定长度的子字符串。
#!/usr/bin/perl use strict; use warnings; use v5.34.0; my $text = "Hello, Perl world!"; my $sub = substr($text, 7, 4); print "Original: $text\n"; print "Substring: '$sub'\n";
我们从位置 7(0 基索引)开始提取一个 4 个字符的子字符串。该函数返回 "Perl",而不会修改原始字符串。
$ ./basic.pl Original: Hello, Perl world! Substring: 'Perl'
负数偏移量
负数偏移量从字符串末尾开始计数,这对于访问后缀非常有用。
#!/usr/bin/perl use strict; use warnings; use v5.34.0; my $filename = "document.txt"; my $extension = substr($filename, -3); print "Filename: $filename\n"; print "Extension: '$extension'\n";
使用 -3 作为偏移量意味着从字符串末尾开始计数。这会提取最后 3 个字符,通常用于文件扩展名。
$ ./negative.pl Filename: document.txt Extension: 'txt'
省略长度
当省略长度时,substr
会返回所有剩余的字符。
#!/usr/bin/perl use strict; use warnings; use v5.34.0; my $text = "The quick brown fox"; my $rest = substr($text, 10); print "Original: $text\n"; print "From position 10: '$rest'\n";
从位置 10 开始,我们不指定长度即可获得所有剩余的字符。这对于在已知位置拆分字符串非常方便。
$ ./length_omit.pl Original: The quick brown fox From position 10: 'brown fox'
字符串替换
当 substr
用作左值时,它可以修改字符串。
#!/usr/bin/perl use strict; use warnings; use v5.34.0; my $text = "I like apples"; substr($text, 7, 6) = "oranges"; print "Modified string: $text\n";
我们用 "oranges" 替换从位置 7 开始的 6 个字符。通过左值赋值,原始字符串被直接修改。
$ ./replace.pl Modified string: I like oranges
插入字符串
将长度设置为 0 并进行替换,即可在不删除字符的情况下进行插入。
#!/usr/bin/perl use strict; use warnings; use v5.34.0; my $text = "Hello world!"; substr($text, 6, 0) = "beautiful "; print "Modified string: $text\n";
通过指定长度为 0,我们在位置 6 插入 "beautiful ",而不会删除任何现有字符。这执行的是纯插入操作。
$ ./insert.pl Modified string: Hello beautiful world!
与正则表达式结合使用
substr
可以与正则表达式匹配一起使用,以进行精确的字符串操作。
#!/usr/bin/perl use strict; use warnings; use v5.34.0; my $text = "Date: 2023-04-15"; $text =~ /(\d{4}-\d{2}-\d{2})/; my $date = substr($text, $-[1], $+[1] - $-[1]); print "Extracted date: $date\n";
我们使用正则表达式匹配变量 $-[1]
和 $+[1]
来获取匹配日期的开始和结束位置。然后 substr
精确地提取该部分。
$ ./regex.pl Extracted date: 2023-04-15
多字节字符处理
对于 Unicode 字符串,需要特别考虑字符边界。
#!/usr/bin/perl use strict; use warnings; use v5.34.0; use utf8; my $text = "日本語のテキスト"; my $sub = substr($text, 3, 3); print "Original: $text\n"; print "Substring: $sub\n";
在使用 UTF-8 字符串时,位置指的是字符而不是字节。该示例从位置 3 开始提取 3 个日文字符。
$ ./unicode.pl Original: 日本語のテキスト Substring: のテキ
最佳实践
- 检查边界: 验证位置是否在字符串长度之内。
- 使用负数偏移量: 方便从末尾开始访问。
- 记录复杂操作: 在组合多个功能时。
- 考虑 Unicode: 注意多字节字符的处理。
来源
本教程介绍了 Perl 的 substr
函数,并通过实际示例演示了其在常见字符串操作场景中的用法。
作者
列出 所有 Perl 教程。