我正在尝试使用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不喜欢该数组。有没有我应该使用的替代方案或我的语法不正确?
答案 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
中的文档解释了为什么引用是好事; - )