繁体   English   中英

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

[英]How do I use Perl's grep function with an array?

我试图在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不喜欢该数组。 我应该使用替代方法还是语法不正确?

@test2恰好由一个元素组成,该元素是数组引用,而regex会强制进行字符串化,这可能是您未曾想到的,

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);

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

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

相当于

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

您可能想要将3个元素的列表分配给@test2 做到这一点的方法是使用( ... )表示法。

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

如果您打算将变量“ @test2 ”用作数组引用 (因为[ ]是这里的匿名数组构造函数),则应给它一个类似于$test2的名称(即标量变量),然后在使用grep时取消引用:

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

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

如果然后打印@results@results2 @results与“ ."\\n";串联."\\n";这将为输出创建标量上下文。数组的标量上下文将显示数组中的元素数。如果使用join进行打印,则将显示显示元素:

print join "\n", @results2 ;

输出:

AAA
AAB
AAC

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM