ZetCode

Perl chomp 函数

最后修改于 2025 年 4 月 4 日

Perl 的 chomp 函数用于移除字符串末尾的换行符。在读取输入以清理行尾符时,它通常被使用。

chomp 比其他方法更安全,因为它只移除当前的输入记录分隔符 ($/),而不是所有空白字符。它返回被移除字符的数量。

chomp 的基本用法

使用 chomp 最简单的方式是作用于单个变量。

basic.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $text = "Hello there\n";
print "Before: '$text'\n";

my $removed = chomp($text);
print "After: '$text'\n";
print "Removed $removed character(s)\n";

我们演示了 chomp 如何从字符串中移除换行符。该函数会修改原始变量并返回移除的计数。

$ ./basic.pl
Before: 'Hello there
'
After: 'Hello there'
Removed 1 character(s)

读取用户输入

chomp 经常与用户输入一起使用,以移除换行符。

input.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

print "Enter your name: ";
my $name = <STDIN>;
chomp $name;

print "Hello, $name! You entered ", length($name), " characters\n";

此脚本读取用户输入并移除末尾的换行符。如果没有 chomp,换行符将被包含在长度计算中。

$ ./input.pl
Enter your name: Alice
Hello, Alice! You entered 5 characters

chomp 用于数组

chomp 可以一次处理整个数组。

array.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my @lines = ("First line\n", "Second line\n", "Third line\n");
print "Before:\n@lines";

my $total = chomp(@lines);
print "After:\n@lines";
print "Total removed: $total\n";

当应用于数组时,chomp 会处理每个元素。它返回从所有元素中移除的总字符数。

$ ./array.pl
Before:
First line
 Second line
 Third line
After:
First line Second line Third line
Total removed: 3

chomp 与 chop 的区别

chompchop 更安全,因为它更具选择性。

compare.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $text1 = "Hello\n";
my $text2 = "Hello";

print "Using chomp:\n";
my $copy1 = $text1;
chomp($copy1);
print "'$copy1'\n";

print "Using chop:\n";
my $copy2 = $text1;
chop($copy2);
print "'$copy2'\n";

print "Chomp on string without newline:\n";
my $copy3 = $text2;
chomp($copy3);
print "'$copy3'\n";

chop 无条件地移除最后一个字符,而 chomp 只移除输入记录分隔符。

$ ./compare.pl
Using chomp:
'Hello'
Using chop:
'Hello'
Chomp on string without newline:
'Hello'

自定义输入分隔符

$/ 变量控制 chomp 移除什么。

separator.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $text = "Hello:::there:::";
local $/ = ":::";  # Set custom separator

print "Before: '$text'\n";
chomp($text);
print "After: '$text'\n";

我们更改 $/ 以移除自定义分隔符而不是换行符。local 关键字将更改限制在当前作用域内。

$ ./separator.pl
Before: 'Hello:::there:::'
After: 'Hello:::there'

读取文件

在逐行处理文件时,chomp 是必不可少的。

file.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

open(my $fh, '<', 'data.txt') or die "Can't open file: $!";

while (my $line = <$fh>) {
    chomp $line;
    print "Processed: '$line'\n";
}

close($fh);

此脚本读取文件并移除每行末尾的换行符。如果没有 chomp,换行符将被包含在处理中。

chomp 在列表上下文中的应用

chomp 可以在列表操作中创造性地使用。

list.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my @lines = ("apple\n", "banana\n", "cherry\n");
my @clean = map { chomp; $_ } @lines;

print "Cleaned: @clean\n";
print "Original modified: @lines\n";

我们将 mapchomp 结合使用,创建了一个清理过的数组,同时保留了原始数组。请注意,chomp 是就地修改的。

$ ./list.pl
Cleaned: apple banana cherry
Original modified: apple banana cherry

最佳实践

来源

Perl chomp 文档

本教程通过实际示例介绍了 Perl 的 chomp 函数,演示了其在常见场景中的用法。

作者

我的名字是 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教学编程方面拥有超过十年的经验。

列出 所有 Perl 教程