ZetCode

Perl grep

最后修改于 2023 年 8 月 24 日

Perl grep 教程展示了如何使用 Perl 的 grep 函数过滤值。

grep 函数会为列表中的每个元素评估一个块或一个表达式,并返回其中表达式评估为 true 的那些元素的列表。它将 $_ 局部设置为每个元素。在标量上下文中,它返回表达式为 true 的次数。

Perl grep 简单示例

我们从一个简单的示例开始。

simple.pl
#!/usr/bin/perl

use v5.34.0;
use warnings;

my @vals = (-3, -1, 0, 3, -4, 2, 3, 4, -7);

my @res = grep { $_ < 0 } @vals;
say "@res"; 

my $n = grep { $_ < 0 } @vals;
say "there are $n negative values";

示例使用 grep 处理整数列表。

my @res = grep { $_ < 0 } @vals;
say "@res"; 

这里我们过滤掉所有负值。

my $n = grep { $_ < 0 } @vals;
say "there are $n negative values";

在标量上下文中,我们得到与给定条件匹配的元素数量。

$ ./simple.pl 
-3 -1 -4 -7
there are 4 negative values

Perl grep 正则表达式

正则表达式可用于过滤数据。

digits.pl
#!/usr/bin/perl

use v5.34.0;
use warnings;

my @vals = ("sky", 0, -1, "cup", "breed", "345", 12);

my @res = grep /\d/, @vals;
say "@res"; 

在此示例中,我们使用 \d 正则表达式从列表中过滤出所有数字。

$ ./digits.pl 
0 -1 345 12

在下一个示例中,我们 grep 一个单词列表。

words.pl
#!/usr/bin/perl

use v5.34.0;
use warnings;

my @words = qw/sky war cup cloud abyss water car book note falcon/;

my @res = grep /^[w,c]/, @words;
say "@res";

my @res2 = grep /^...$/, @words;
say "@res2";

我们找出所有以 'w' 或 'c' 开头的单词,以及所有恰好有三个字符的单词。

$ ./words.pl
war cup cloud water car
sky war cup car

Perl grep 文件

我们可以将 grep 与文件句柄一起使用。

words.txt
sky
water
rock
falcon
cloud
war
nice
cup
wrong

我们有一个小的文本文件。

fhandle.pl
#!/usr/bin/perl

use v5.34.0;
use warnings;

open my $fh, "<", "words.txt"
    or die "cannot open file $!";

my @res = grep /^w/, <$fh>;
say join "", @res; 

close $fh;

我们 grep 文件句柄以查找所有以 'w' 开头的单词;

$ ./fhandle.pl
water
war
wrong

在本文中,我们使用了 Perl 的 grep 函数。

作者

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

列出 所有 Perl 教程