希望从名称如下的名称中分割成名字,中间名和姓氏:
# this is the format
$full_name = 'lastname, firstname (middleinitial)'
# this is what it would look like
$full_name = 'Doe, John (D)'
名称始终遵循此格式。这些将存储在变量first
,middle
和last
中。 middle
不应包含任何括号。是的,拆分功能可以在这里使用;但是,full_name
不保证包含字符串。它可能是:
$full_name = ''
我不确定拆分是否适合这样的事情。像我所描述的那样分割名字的最佳方法是什么?
答案 0 :(得分:2)
my $full_name = 'Doe, John (D)';
my ($last, $first, $middle) = split /[,() ]+/, $full_name;
答案 1 :(得分:2)
use strict;
use warnings;
my $full_name = 'Doe, John (D)';
my ($last, $first, $middle) = $full_name =~ /([\w'-]+)/g;
print "First: $first\nMiddle: $middle\nLast: $last";
输出:
First: John
Middle: D
Last: Doe
答案 2 :(得分:0)
您可以将这些与速记字符类匹配:\w+
当然,这不是你所要求的?
如果你想让它变得更复杂:
(^\w+)|((?<=\s)\w+(?=\s))|(\w+(?=\)))
哪个会捕获:
group 1
group 2
group 3
答案 3 :(得分:0)
这个问题并不像看起来那么简单,答案取决于实际的数据。
考虑到模糊的规范,我不会写这个
use strict;
use warnings;
my $name_possibles = qr/[^ \s , ( ) [:cntrl:] ]/x;
my $name_re = qr/(?: $name_possibles+ (?: \s+ $name_possibles+ )* )/x;
my $full_name = 'Doe, John (D)';
my @parts = $full_name =~ /($name_re), \s* ($name_re) \s* \( \s* ($name_re) \s* \)/xg;
use Data::Dump;
dd \@parts;
<强>输出强>
["Doe", "John", "D"]