字符串运算符 #

一、字符串连接 . #

1.1 基本连接 #

使用 . 连接字符串:

perl
my $str1 = "Hello";
my $str2 = "World";
my $result = $str1 . ", " . $str2 . "!";
print $result;

1.2 连接数字 #

数字会自动转换为字符串:

perl
my $name = "Perl";
my $version = 5.36;
my $full = $name . " v" . $version;
print $full;

1.3 多次连接 #

perl
my $str = "a" . "b" . "c" . "d";
print $str;

二、字符串重复 x #

2.1 基本重复 #

使用 x 重复字符串:

perl
my $line = "-" x 20;
print $line . "\n";

my $dots = "." x 3;
print $dots . "\n";

2.2 创建模式 #

perl
my $separator = "=" x 40;
my $border = "*" x 30;
my $indent = " " x 4;

print $separator . "\n";
print $indent . "Hello\n";
print $border . "\n";

2.3 列表重复 #

perl
my @arr = (1) x 5;
print "@arr\n";

my @zeros = (0) x 10;
print "@zeros\n";

三、字符串插值 #

3.1 双引号插值 #

perl
my $name = "Perl";
my $greeting = "Hello, $name!";
print $greeting . "\n";

3.2 复杂变量插值 #

perl
my @items = ("apple", "banana");
my $list = "Items: @items";
print $list . "\n";

my %person = (name => "Tom");
my $info = "Name: $person{name}";
print $info . "\n";

3.3 花括号分隔 #

perl
my $name = "Perl";
my $str1 = "${name}script";
my $str2 = "${name}5";
print "$str1, $str2\n";

3.4 避免插值 #

perl
my $name = "Perl";

my $str1 = '$name';
my $str2 = "\$name";
print "$str1, $str2\n";

四、字符串函数 #

4.1 长度 #

perl
my $str = "Hello, World!";
my $len = length($str);
print "Length: $len\n";

4.2 子串 #

perl
my $str = "Hello, World!";

my $sub1 = substr($str, 0, 5);
my $sub2 = substr($str, 7);
my $sub3 = substr($str, -6, 5);

print "$sub1\n";
print "$sub2\n";
print "$sub3\n";

修改子串:

perl
my $str = "Hello, World!";
substr($str, 7, 5) = "Perl";
print "$str\n";

4.3 查找 #

perl
my $str = "Hello, World!";

my $pos1 = index($str, "o");
my $pos2 = index($str, "o", 5);
my $pos3 = rindex($str, "o");

print "First 'o': $pos1\n";
print "Second 'o': $pos2\n";
print "Last 'o': $pos3\n";

4.4 大小写转换 #

perl
my $str = "Hello, World!";

my $upper = uc($str);
my $lower = lc($str);
my $first_upper = ucfirst($str);
my $first_lower = lcfirst($str);

print "$upper\n";
print "$lower\n";
print "$first_upper\n";
print "$first_lower\n";

4.5 去除空白 #

perl
my $str = "  Hello, World!  ";

$str =~ s/^\s+//;
$str =~ s/\s+$//;

$str =~ s/^\s+|\s+$//g;

4.6 分割与连接 #

perl
my $str = "apple,banana,cherry";
my @arr = split /,/, $str;
print "@arr\n";

my $joined = join "-", @arr;
print "$joined\n";

五、字符串格式化 #

5.1 sprintf #

perl
my $name = "Perl";
my $version = 5.36;

my $str = sprintf("%s v%.2f", $name, $version);
print "$str\n";

5.2 格式说明符 #

说明符 说明
%s 字符串
%d 整数
%f 浮点数
%x 十六进制
%o 八进制
%b 二进制
%% 百分号
perl
my $num = 42;
printf "Decimal: %d\n", $num;
printf "Hex: 0x%x\n", $num;
printf "Float: %.2f\n", $num;
printf "Padded: %05d\n", $num;
printf "Left: %-10s|\n", "Hello";
printf "Right: %10s|\n", "Hello";

六、Here文档 #

6.1 基本语法 #

perl
my $text = <<'END';
This is a multi-line
string that preserves
all formatting.
END

print $text;

6.2 插值Here文档 #

perl
my $name = "Perl";
my $text = <<"END";
Hello, $name!
Welcome to the world of programming.
END

print $text;

6.3 使用Here文档 #

perl
print <<"HTML";
<html>
<head><title>Test</title></head>
<body>
<h1>Hello</h1>
</body>
</html>
HTML

七、实用示例 #

7.1 字符串填充 #

perl
sub pad_left {
    my ($str, $len, $char) = @_;
    $char //= " ";
    return $char x ($len - length($str)) . $str;
}

sub pad_right {
    my ($str, $len, $char) = @_;
    $char //= " ";
    return $str . $char x ($len - length($str));
}

print pad_left("42", 5, "0") . "\n";
print pad_right("Hello", 10, ".") . "\n";

7.2 字符串截断 #

perl
sub truncate {
    my ($str, $max_len, $suffix) = @_;
    $suffix //= "...";
    
    if (length($str) > $max_len) {
        return substr($str, 0, $max_len - length($suffix)) . $suffix;
    }
    return $str;
}

print truncate("Hello, World!", 10) . "\n";
print truncate("Short", 10) . "\n";

八、实践练习 #

练习1:格式化输出 #

perl
#!/usr/bin/perl
use strict;
use warnings;
use v5.10;

my @data = (
    { name => "Alice", score => 95 },
    { name => "Bob", score => 87 },
    { name => "Charlie", score => 92 },
);

say "=" x 30;
say sprintf("%-10s | %s", "Name", "Score");
say "-" x 30;

foreach my $item (@data) {
    say sprintf("%-10s | %3d", $item->{name}, $item->{score});
}

say "=" x 30;

练习2:字符串处理 #

perl
#!/usr/bin/perl
use strict;
use warnings;
use v5.10;

my $text = "  Hello, Perl World!  ";

my $trimmed = $text;
$trimmed =~ s/^\s+|\s+$//g;

my @words = split /\s+/, $trimmed;
my $word_count = scalar @words;

my $reversed = join " ", reverse @words;

say "Original: '$text'";
say "Trimmed: '$trimmed'";
say "Words: $word_count";
say "Reversed: '$reversed'";

练习3:模板替换 #

perl
#!/usr/bin/perl
use strict;
use warnings;
use v5.10;

my $template = "Hello, {name}! Your score is {score}.";

my %vars = (
    name  => "Tom",
    score => 95,
);

my $result = $template;
$result =~ s/\{(\w+)\}/$vars{$1}/g;

say $result;

九、总结 #

本章学习了:

  • 字符串连接运算符 .
  • 字符串重复运算符 x
  • 字符串插值
  • 常用字符串函数
  • 字符串格式化
  • Here文档

下一章将学习比较运算符。

最后更新:2026-03-27