操纵单个和多个单词字符串

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

如何更改以满足这一个单词和两个以上的单词名称?是应该将一个单词和两个以上的单词名称移动到一个新的数组中,然后再进行处理,还是可以更改正则表达式以满足此要求?

Rob*_*arl 5

您可以使用split正则表达式将名字与其他名称分开,而不是使用正则表达式:

my ($first, @rest) = split;
Run Code Online (Sandbox Code Playgroud)

然后substr在内部map提取缩写:

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)