南平市文章资讯

Perl字符串处理函数大全

2026-04-07 07:49:01 浏览次数:5
详细信息

一、基础字符串操作

1. 长度与大小写

# 字符串长度
my $len = length($string);

# 大小写转换
my $upper = uc($string);     # 全大写
my $lower = lc($string);     # 全小写
my $first = ucfirst($string); # 首字母大写
my $title = lcfirst($string); # 首字母小写

2. 查找与索引

# 查找子串位置(从0开始)
my $pos = index($string, $substr);    # 第一次出现
my $pos = index($string, $substr, 3); # 从位置3开始查找
my $pos = rindex($string, $substr);   # 最后一次出现

# 检查包含
if (index($string, $substr) != -1) {
    # 包含子串
}

# 使用正则查找位置
if ($string =~ /pattern/) {
    my $pos = $-[0];  # 匹配开始位置
    my $end = $+[0];  # 匹配结束位置
}

二、子串操作

1. 提取子串

# substr - 提取/替换子串
my $sub = substr($string, $start, $length);  # 提取
substr($string, $start, $length, $replacement);  # 替换

# 示例
my $str = "Hello World";
my $sub = substr($str, 6, 5);  # "World"
substr($str, 0, 5, "Hi");      # $str 变为 "Hi World"

2. 分割与连接

# split - 分割字符串
my @parts = split(/pattern/, $string);
my @words = split(/\s+/, $string);      # 按空白分割
my @chars = split(//, $string);         # 分割为字符
my @lines = split(/\n/, $string);       # 按行分割

# join - 连接数组为字符串
my $joined = join($delimiter, @array);
my $csv = join(",", @fields);           # 创建CSV
my $path = join("/", $dir, $file);      # 路径拼接

三、替换与修改

1. 基本替换

# 替换操作符
$string =~ s/pattern/replacement/;     # 替换第一个
$string =~ s/pattern/replacement/g;    # 替换所有
$string =~ s/pattern/replacement/i;    # 忽略大小写

# 删除子串
$string =~ s/pattern//g;               # 删除所有匹配

# 使用变量
my $old = "foo";
my $new = "bar";
$string =~ s/\Q$old\E/$new/g;          # \Q \E 转义特殊字符

2. 翻译/转换

# tr/// 或 y/// - 字符转换
$string =~ tr/abc/ABC/;       # a->A, b->B, c->C
$string =~ tr/a-z/A-Z/;      # 转为大写
$string =~ tr/0-9//d;        # 删除数字 (d=delete)
$count = $string =~ tr/a//;  # 统计'a'的数量
$count = $string =~ tr/ //c; # 统计非空格字符

四、格式与清理

1. 去除空白

# 去除首尾空白
$string =~ s/^\s+|\s+$//g;      # 方法1
use String::Util qw(trim);      # 方法2(需安装模块)
$string = trim($string);

# 去除左侧空白
$string =~ s/^\s+//;
# 去除右侧空白
$string =~ s/\s+$//;

# 压缩内部空白
$string =~ s/\s+/ /g;           # 多个空白变一个空格

2. 填充与格式化

# sprintf - 格式化字符串
my $formatted = sprintf("%-20s %10d", $name, $value);
my $hex = sprintf("0x%X", $number);
my $float = sprintf("%.2f", $number);

# printf - 直接输出
printf("%-20s %10d\n", $name, $value);

五、引用与转义

1. 引号相关

# qq - 双引号(支持变量插值)
my $str = qq(Hello $name);      # 等价于 "Hello $name"

# q - 单引号(无变量插值)
my $str = q(Hello $name);       # 字面包含 $name

# qw - 单词列表
my @array = qw(apple banana cherry);  # 无需引号和逗号

# qx - 执行命令
my $output = qx(date);

2. 转义函数

# 转义特殊字符
my $escaped = quotemeta($string);      # 添加反斜杠
my $safe = quotemeta("file.txt");      # "file\.txt"

# 反转义
use HTML::Entities;
encode_entities($string);      # HTML转义
decode_entities($string);      # HTML反转义

# URL编码解码
use URI::Escape;
my $encoded = uri_escape($string);
my $decoded = uri_unescape($string);

六、比较与测试

1. 字符串比较

# 比较操作符
if ($str1 eq $str2) {}      # 字符串相等
if ($str1 ne $str2) {}      # 字符串不等
if ($str1 lt $str2) {}      # 小于(字典序)
if ($str1 gt $str2) {}      # 大于
if ($str1 le $str2) {}      # 小于等于
if ($str1 ge $str2) {}      # 大于等于

# 比较函数
my $cmp = $str1 cmp $str2;  # -1,0,1 类似strcmp

2. 类型测试

# 数字测试
if ($string =~ /^\d+$/) {}      # 全是数字
if ($string =~ /^\D+$/) {}      # 全非数字

# 空白测试
if ($string =~ /^\s*$/) {}      # 全是空白或空

# 包含测试
if ($string =~ /[a-zA-Z]/) {}   # 包含字母
if ($string =~ /[0-9]/) {}      # 包含数字

七、高级字符串处理

1. 多行处理

# 多行模式
$/ = undef;                    # 读取整个文件
my $content = <FILE>;
$/ = "\n";                     # 恢复行模式

# 行处理
while (my $line = <FILE>) {
    chomp($line);              # 去除换行符
    # 处理每行
}

# 段落模式
$/ = "";                       # 按段落读取

2. Unicode处理

use utf8;                       # 源代码使用UTF-8
use Encode qw(decode encode);

my $utf8 = decode('UTF-8', $bytes);
my $bytes = encode('UTF-8', $utf8);

# Unicode字符串函数
use Unicode::Normalize;
my $nfc = NFC($string);        # 标准化格式C
my $nfd = NFD($string);        # 标准化格式D

3. 格式字符串(pack/unpack)

# pack - 数据打包
my $binary = pack("N", 12345);     # 32位网络字节序
my $hex = unpack("H*", $binary);   # 转十六进制

# 常用格式
# c C 有/无符号字符
# s S 有/无符号短整型
# l L 有/无符号长整型
# n N 网络字节序(16/32位)
# a A 字符串(空填充/空格填充)

八、实用技巧示例

示例1:CSV处理

# 简单CSV解析
my $csv = "a,b,c,d";
my @fields = split(/,/, $csv);

# 处理带引号的CSV
use Text::CSV;
my $csv_parser = Text::CSV->new();
$csv_parser->parse($line);
my @columns = $csv_parser->fields();

示例2:模板替换

# 简单模板系统
my $template = "Hello {name}, your score is {score}";
my %data = (name => "Alice", score => 95);

$template =~ s/\{(\w+)\}/$data{$1}/g;
# 结果: "Hello Alice, your score is 95"

示例3:字符串反转

# 反转字符串
my $reversed = reverse($string);

# 反转单词顺序
my $sentence = "Hello World Perl";
my $reversed_words = join(" ", reverse split(/\s+/, $sentence));
# 结果: "Perl World Hello"

示例4:生成随机字符串

# 随机字符串
sub random_string {
    my $length = shift;
    my @chars = ('a'..'z', 'A'..'Z', '0'..'9');
    return join('', map { $chars[rand @chars] } 1..$length);
}

my $random = random_string(10);

九、常用模块推荐

# 标准库
use String::Util;      # trim, unquote等
use Text::ParseWords;  # 高级分词
use Text::Wrap;        # 文本换行

# CPAN热门模块
use String::Random;    # 随机字符串生成
use Text::CSV;         # CSV处理
use HTML::Strip;       # HTML标签去除
use JSON;              # JSON编码解码

最佳实践建议

使用 \Q...\E 转义变量中的正则特殊字符 优先使用 index() 而不是正则进行简单查找 处理Unicode时 明确指定编码 大量字符串拼接 使用 join() 而不是 .= 处理路径 使用 File::SpecPath::Tiny

这个列表涵盖了Perl字符串处理的主要功能。根据具体需求选择合适的函数和模块。

相关推荐