我如何对数组使用 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 不喜欢数组。我应该使用替代方法还是我的语法不正确?
语法 [ ... ]
定义了对数组而非列表的引用,并且您的声明
my @test2 = ["AAA", "AAB", "AAC"];
等同于
my @test2;
$test2[0] = ["AAA", "AAB", "AAC"];
您可能想将包含 3 个元素的列表分配给 @test2
。这样做的方法是使用 ( ... )
符号。
my @test2 = ('AAA', 'AAB', 'AAC');
@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);
如果你想让变量“@test2
”成为一个array reference(因为[ ]
在这里是匿名数组构造函数)那么你应该给它起一个像[=15这样的名字=](即标量变量),然后在使用 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 ;
输出:
AAA
AAB
AAC
perldoc perlreftut
中的文档解释了为什么引用是一件好事;-)
我正在尝试使用 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 不喜欢数组。我应该使用替代方法还是我的语法不正确?
语法 [ ... ]
定义了对数组而非列表的引用,并且您的声明
my @test2 = ["AAA", "AAB", "AAC"];
等同于
my @test2;
$test2[0] = ["AAA", "AAB", "AAC"];
您可能想将包含 3 个元素的列表分配给 @test2
。这样做的方法是使用 ( ... )
符号。
my @test2 = ('AAA', 'AAB', 'AAC');
@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);
如果你想让变量“@test2
”成为一个array reference(因为[ ]
在这里是匿名数组构造函数)那么你应该给它起一个像[=15这样的名字=](即标量变量),然后在使用 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 ;
输出:
AAA
AAB
AAC
perldoc perlreftut
中的文档解释了为什么引用是一件好事;-)