匹配后从Perl数组打印单词

时间:2015-10-04 16:17:49

标签: perl

数组@array

 Sex: M
 Name: John, oliver
 Age is 33
 Has no experience
 is 5 feet tall

我想打印Name:之后的单词,这是John,在这种情况下是oliver。

下面的代码适用于$string,如何在@array上执行相同操作?

my ($name) = $string =~ /Name: (.+)$/;
print $name;

3 个答案:

答案 0 :(得分:1)

你必须iterate over数组,在每个元素上应用正则表达式。类似的东西:

my @array = ( 'Sex: M', 'Name: John, oliver', 'Age: 33' )
foreach my $item ( @array ) {
  if( $item =~ /Name: (.+)$/ ) {
    print $1;
  }
}

我认为hash是存储数据的更好的数据结构。

答案 1 :(得分:1)

要在数组中查找结果,作业的工具为grep

foreach my $name_lines ( grep { m/Name/ } @array ) {
      my ($name) = /Name: (.+)$/;
      print $name,"\n"; 
}

我在这里假设可能有多场比赛 - 你不必这样做,特别是可以这样做:

 my ($name) = map { m/Name: (.+$)/ } @stuff;
 print $name;

这使用map来转换数组,但是因为我们将它分配给包含单个标量的列表,所以第二个匹配被丢弃。 (如果有的话)。

虽然我建议这不是最好的方法 - 与哈希相比,一系列键和值并不是特别有用。

如果您有阵列:

my @stuff = ( "Sex: M",
 "Name: John, oliver", 
 "Age is 33",
 "Has no experience",
 "is 5 feet tall" ); 

然后您可以使用map

对其进行转换
my %stuff_hash = map { /(\w+):? (.*)$/ } @stuff;

它为您提供了如下所示的数据结构:

$VAR1 = {
          'Age' => 'is 33',
          'Sex' => 'M',
          'is' => '5 feet tall',
          'Name' => 'John, oliver',
          'Has' => 'no experience'
        };

所以你可以:

print $stuff_hash{'Name'},"\n";

或者 - 将你的阵列重新组合成一个字符串,然后多行化正则表达式:

my ($name) =   join ( "\n", @stuff) =~ m/Name: (.*)$/m;
print $name;

答案 2 :(得分:0)

让结构适合您的数据

my @arr = (     
   {
      Sex => 'M',
      Name => 'John Doe',
      Age => 21,
   },
   {
      Sex => 'F',
      Name => 'Jane Doe',
      Age => 20,
   },
);

然后您可以更轻松地找到数据:

for (@arr){
   print "$_->{Name}\n";
}