ZetCode

Perl substr 函数

最后修改于 2025 年 4 月 4 日

Perl 的 substr 函数用于提取或替换字符串的部分。它是一个功能强大的字符串操作工具,具有多种操作模式。

substr 可以作为左值(可修改)使用,也可以返回一个子字符串。它同时支持正数和负数偏移量,从而实现灵活的字符串访问。

substr 的基本用法

最简单的形式是从指定位置开始,提取指定长度的子字符串。

basic.pl
#!/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'

负数偏移量

负数偏移量从字符串末尾开始计数,这对于访问后缀非常有用。

negative.pl
#!/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 会返回所有剩余的字符。

length_omit.pl
#!/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 用作左值时,它可以修改字符串。

replace.pl
#!/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 并进行替换,即可在不删除字符的情况下进行插入。

insert.pl
#!/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 可以与正则表达式匹配一起使用,以进行精确的字符串操作。

regex.pl
#!/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 字符串,需要特别考虑字符边界。

unicode.pl
#!/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: のテキ

最佳实践

来源

Perl substr 文档

本教程介绍了 Perl 的 substr 函数,并通过实际示例演示了其在常见字符串操作场景中的用法。

作者

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

列出 所有 Perl 教程