2013-04-09 60 views
0

我在Perl中的數組具有這樣的值:正則表達式在Perl數組

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

我需要一個正EXP指找到[]之間的所有文本。
我寫了這個:

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

然而,這僅找到了第一場比賽,像a$Array[0]e$Array[2]
我想從$Array[0]得到他們所有的人,如a,b,c

+0

實際上,在每個數組元素中是否有散列引用,或者是否在花括號{}'周圍引入了某種引用? – TLP 2013-04-09 08:52:22

+0

我使用{}以免與[]混淆。它只是一個數組,而「」中的每一行都是它的元素。 – 2013-04-09 09:02:07

+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)。 – 2013-04-09 16:52:37

回答

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。 – 2013-04-09 09:00:43

+4

@SomnathPaul改用'。+?'來避免捕獲空元素。或者避免使用非貪婪捕捉並使用'[^]] +' – TLP 2013-04-09 09:06:07