好的,这就是我提出的第一个问题的后续问题,我认为这个问题得到了充分的回答。无论如何,在我的项目的这一部分,我有一个字符串数组。这些字符串的独特之处在于没有明显的模式。我在一个大数组的单个字符串元素中有一个作者列表。有些元素有两位作者,有些则有更多。这是一个例子:
Artem Chebotko和Shiyong Lu
Artem Chebotko,Shiyong Lu,Farshad Fotouhi和Anthony Aristar
Craig Franke,Samuel Morin,Artem Chebotko,John Abraham和Pearl Brazier 王立强,陆世勇,徐博飞,Artem Chebotko,H。Victoria Bryant和Jeffrey L. Ram Daniel Rebollar,Peter J. Vasquez Sr.和Artem Chebotko
所以虽然很好地摆脱了混乱我的初始字符串的所有HTML爵士乐,但我想1)将每个作者放入一个数组中自己的字符串中,并且2)使它成为我可以按姓氏对作者进行排序。我想知道的是,因为数组中没有哪种模式更适合这个任务,substr或split?以下是关于我的阵列的一些值得注意的事项:
我想指出我对Perl还不熟悉,但我来自C ++,所以我对计算机逻辑有所了解。说到这一点,我想我知道两者是如何工作的,但我只是想得到一个更熟悉的人的意见,如果其中任何一个比另一个好。我知道计算机代码适用于那些实际上没有的模式。
答案 0 :(得分:4)
我不确定你将如何使用substr?
似乎有三种不同的可能分隔符可以拆分,因此将它们全部加入正则表达式以便与|
进行拆分:
@authors = split /, and |, | and /, $authors
一般来说,分配姓氏的问题是不可解决的,给定多字姓(例如von Neumann),以及“姓氏”首先出现的名称。启发式地,Lingua::EN::NameParse将尝试。 (类似的模块可用于其他一些语言。)
答案 1 :(得分:1)
只是为了一些见解:
#!/usr/bin/perl
use strict;
use warnings;
my $re_and=qr/,? *and */;
my $re_com=qr/, */;
while(<DATA>) {
chomp;
my @authors = split /$re_and|$re_com/;
for (@authors) {
my ($n, $l, $m, $t);
s/\s*$t\s*// if (($t) = /([JS]r\.)/);
my @n = split;
($n, $m, $l) = @n if @n > 2;
($n, $l) = @n if @n == 2;
print join ("::", grep {$_} ($n, $l, $m, $t)), "\n";
}
}
__DATA__
Artem Chebotko and Shiyong Lu
Artem Chebotko, Shiyong Lu, Farshad Fotouhi, and Anthony Aristar
Craig Franke, Samuel Morin, Artem Chebotko, John Abraham, and Pearl Brazier
Liqiang Wang, Shiyong Lu, Xubo Fei, Artem Chebotko, H. Victoria Bryant, and Jeffrey L. Ram
Daniel Rebollar, Peter J. Vasquez Sr., and Artem Chebotko
<强>输出强>
Artem::Chebotko
Shiyong::Lu
Artem::Chebotko
Shiyong::Lu
Farshad::Fotouhi
Anthony::Aristar
Craig::Franke
Samuel::Morin
Artem::Chebotko
John::Abraham
Pearl::Brazier
Liqiang::Wang
Shiyong::Lu
Xubo::Fei
Artem::Chebotko
H.::Bryant::Victoria
Jeffrey::Ram::L.
Daniel::Rebollar
Peter::Vasquez::J.::Sr.
Artem::Chebotko