per*_*ser 2 regex perl foreach
我有一个包含许多名称的数组:
Fred Smith
Dave Davidson
John
Andy Wood
Robin van Persie
foreach my $name ( @arrayOfNames ) {
my ($first, $last) = $name =~ /(.*)\s+(.).*/;
print "$first$last";
}
Run Code Online (Sandbox Code Playgroud)
使用上面显示的foreach循环,它应该打印以下内容:
FredS
DavidD
John
AndyW
RobinvP
Run Code Online (Sandbox Code Playgroud)
但是,它没有正确处理一个单词名称(John)或两个以上的单词名称(Robin van Persie):
对于一个单词名称(约翰),我得到错误,如下所示
Use of uninitialized value $first in concatenation...
Use of uninitialized value $last in concatenation...
Run Code Online (Sandbox Code Playgroud)
对于两个以上的单词名称(Robin van Persie),它打印Robin vanP而不是RobinvP
如何更改以满足这一个单词和两个以上的单词名称?是应该将一个单词和两个以上的单词名称移动到一个新的数组中,然后再进行处理,还是可以更改正则表达式以满足此要求?
您可以使用split正则表达式将名字与其他名称分开,而不是使用正则表达式:
my ($first, @rest) = split;
Run Code Online (Sandbox Code Playgroud)
my @initials = map { substr $_, 0, 1 } @rest;
Run Code Online (Sandbox Code Playgroud)
然后join他们一起:
join '', $first, @initials;
Run Code Online (Sandbox Code Playgroud)
把它们放在一起:
for (@arrayOfNames) {
my ($first, @rest) = split;
print join '', $first, map { substr $_, 0, 1 } @rest;
}
Run Code Online (Sandbox Code Playgroud)