从Perl数组中打印匹配后的单词

从Perl数组中打印匹配后的单词,perl,Perl,数组@Array已 Sex: M Name: John, oliver Age is 33 Has no experience is 5 feet tall 我想在Name:后面打印单词,在本例中,它是John,oliver 下面的代码适用于$string,如何在@数组上执行相同的操作 my ($name) = $string =~ /Name: (.+)$/; print $name; 您必须在数组中对每个元素应用正则表达式。比如: my @array = ( 'Sex: M',

数组
@Array

 Sex: M
 Name: John, oliver
 Age is 33
 Has no experience
 is 5 feet tall
我想在
Name:
后面打印单词,在本例中,它是John,oliver

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

my ($name) = $string =~ /Name: (.+)$/;
print $name;
您必须在数组中对每个元素应用正则表达式。比如:

my @array = ( 'Sex: M', 'Name: John, oliver', 'Age: 33' )
foreach my $item ( @array ) {
  if( $item =~ /Name: (.+)$/ ) {
    print $1;
  }
}
我认为是一种更好的数据结构来存储数据。

让该结构适合您的数据 然后您可以更轻松地找到数据:

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

要在数组中查找结果,作业的工具是
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;

当显示变量的内容时,最好使用
Data::Dumper
,这样这里的人就能确切地知道您的数据结构。您能显示实际的输入吗?谢谢,编辑数组内容以显示无法使用哈希。虽然可能是真的,但这个答案基本上是“如果您想去那里,不要从这里开始”. 这并不总是一个选择。是的。您发布了问题的解决方案,并提到使用另一种结构。我想展示这样一种结构。
my ($name) =   join ( "\n", @stuff) =~ m/Name: (.*)$/m;
print $name;