2013-04-09 4 views
0

У меня есть массив в Perl, который имеет значение, как это:Regex в PERL массива

$Array[0] = "[a][b][c] good bad"; 
$Array[1] = "[d] apple"; 
$Array[2] = "[e][f] mango "; 
$Array[3] = "[g] capgemini"; 

мне нужна регулярная ехр, который находит весь текст между [].
Я написал это:

my @matched = grep {$_ ne ""} map { m/\[(.*?)\]/; $1; } @Array; 

Однако это находит только первый матч, как a из $Array[0], e от $Array[2].
Я хочу получить все из них, как a,b,c от $Array[0].

+0

У вас на самом деле есть хеш-ссылка в каждом элементе массива, или вы разместили какую-то цитату вокруг фигурных скобок '{}'? – TLP

+0

Я использовал {}, чтобы не путать с []. Это массив, и каждая строка внутри «" - это его элемент. –

+0

С этого момента отправьте свои данные примера как действительный код Perl или как хорошо распознанный формат данных. Вы можете использовать вывод [Data :: Dumper] (http://p3rl.org/Data::Dumper), [Data :: Printer] (http://p3rl.org/Data::Printer), [JSON ] (http://p3rl.org/JSON), [YAML] (http://p3rl.org/YAML::Any). –

ответ

3

Ваше использование анонимных хэшей и пропуска сигил сбивает с толку. Это работает для меня, хотя:

#!/usr/bin/perl 
use warnings; 
use strict; 

use Data::Dumper; 

my @Array; 
$Array[0]= "[a][b][c] good bad"; 
$Array[1]= "[d] apple"; 
$Array[2]= "[e][f] mango "; 
$Array[3]= "[g] capgemini"; 
my @matched = map { m/\[(.*?)\]/g } @Array; 
print Dumper \@matched; 

Основная хитрость заключается в использовании /g вариант для глобального согласования и позволяя сращивание вернуть все матчи.

+0

У нас может быть несколько [], который пуст. Но в нашем финальном массиве мы не хотим пустых элементов, поэтому мы также можем использовать grep. –

+4

@SomnathPaul Используйте '. +?' Вместо этого, чтобы избежать захвата пустых элементов. Или избегайте использования не-жадного захвата и используйте '[^]] +' – TLP