如何在阵列中使用Perl的grep函数?

时间:2015-03-02 23:22:15

标签: arrays regex perl list grep

我正在尝试使用Perl中的grep函数来查找数组中正则表达式的匹配数。我知道grep应该以列表作为参数,但遗憾的是我试图访问的数据是数组的形式。以下是我的问题的简化示例:

using strict;
using warnings;

my @test = qw(AAA AAB AAC);
my @test2 = ["AAA", "AAB", "AAC"];

my @results = grep(m/AA./, @test);
my @results2 = grep(m/AA./, @test2);

print @results . "\n";
print @results2 . "\n";

由于列表中的每个成员都匹配,因此第一个打印输出3。第二个打印输出0,我假设是因为grep不喜欢该数组。有没有我应该使用的替代方案或我的语法不正确?

3 个答案:

答案 0 :(得分:4)

@test2正好由一个元素组成,它是数组引用,正则表达式强制进行字符串化,这可能是你没想到的,

use strict;
use warnings;

my @test = qw(AAA AAB AAC);
my @test2 = ["AAA", "AAB", "AAC"];

print "$_\n" for @test;
print "$_\n" for @test2;

输出

AAA
AAB
AAC
ARRAY(0x85bfda8)

使用my @test2 = ("AAA", "AAB", "AAC");quote word运营商替代my @test2 = qw(AAA AAB AAC);

答案 1 :(得分:1)

语法[ ... ]定义了对数组的引用,而不是列表和声明

my @test2 = ["AAA", "AAB", "AAC"];

相当于

my @test2;
$test2[0] = ["AAA", "AAB", "AAC"];

您可能想要将3个元素的列表分配给@test2。执行此操作的方法是使用( ... )表示法。

my @test2 = ('AAA', 'AAB', 'AAC');

答案 2 :(得分:1)

如果你想要变量" @test2"成为array reference(因为[ ]是这里的匿名数组构造函数)然后你应该给它一个像$test2的名称(即一个标量变量),然后在使用{{1时取消引用它}}:

grep

然后,如果您打印my $test2 = ["AAA", "AAB", "AAC"]; my @results = grep(m/AA./, @test); my @results2 = grep(m/AA./, @$test2); @results将它们与" @results2连接,则会为您的输出创建标量上下文。数组的标量上下文将显示数组中的元素数。如果您使用."\n";进行打印,则会显示以下元素:

join

<强>输出:

print join "\n", @results2 ;

perldoc perlreftut中的文档解释了为什么引用是好事; - )