数组@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;
答案 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";
}