2015-03-02 3 views
2

Я пытаюсь использовать функцию grep в Perl, чтобы найти количество совпадений для регулярного выражения в массиве. Я знаю, что grep должен взять список в качестве своего параметра, но, к сожалению, данные, которые я пытаюсь получить, имеют форму массива. Вот упрощенный пример моей проблемы:Как использовать функцию grep Perl с массивом?

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 не любит массив. Есть ли альтернатива, которую я должен использовать, или мой синтаксис неверен?

ответ

4

@test2 состоят ровно один элемент, который является ссылкой на массив, и регулярные выражения силы stringification, что-то вы, вероятно, не ожидал,

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

Если вы указали переменную «@test2» как array reference (так как здесь [ ] - это анонимный конструктор массива), тогда вы должны указать ему имя, например $test2 (т. скалярная переменная), а затем разыменования ней при использовании 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 объясняет, почему ссылки хорошая вещь ;-)

Смежные вопросы