0

好的,这是我认为已经得到充分回答的第一个问题的后续。无论如何,在我项目的这一部分,我有一个字符串数组。这些字符串的独特之处在于没有明显的模式。我在一个大数组的单个字符串元素中有一个作者列表。有些元素有两个作者,有些元素有更多。这是一个例子:

Artem Chebotko 和 Shiyong Lu
Artem Chebotko、Shiyong Lu、Farshad Fotouhi 和 Anthony Aristar
Craig Franke、Samuel Morin、Artem Chebotko、John Abraham 和 Pearl Brazier
Wang Liqiang Wang、Shiyong Lu、Xubo Fei、Artem Chebotko、H. Victoria Bryant 和Jeffrey L. Ram
Daniel Rebollar、Peter J. Vasquez Sr. 和 Artem Chebotko

因此,虽然很高兴摆脱所有使我的初始字符串混乱的 HTML 爵士乐,但我想 1)将每个作者放入自己的数组中的字符串中,以及 2)制作它以便我可以对作者按姓氏。我想知道的是,由于数组没有模式,因此更适合此任务,substr 还是 split?以下是关于我的阵列的一些注意事项:

  • 每行都有一个作者姓名,名字和姓氏,有时还有中间名首字母或 Sr./Jr。
  • 如果该行只有两个作者,则用空格和“and”一词分隔。(参见上面的示例)
  • 如果该行有两个以上,则每个元素用逗号分隔,最后一个元素前面有单词“and”。
  • 如果该行只有一位作者,则不需要标点符号或“和”一词。

我想指出,我对 Perl 还是很陌生,但我来自 C++,所以我对计算机逻辑有所了解。话虽如此,我想我知道两者是如何工作的,但我只是想得到一个更熟悉的人的意见,即其中一个是否会比另一个更好。我知道计算机代码适用于这实际上没有的模式。

4

2 回答 2

4

我不确定您将如何使用 substr ?

似乎有三种不同的可能分隔符要拆分,因此将它们全部加入正则表达式以进行拆分|

@authors = split /, and |, | and /, $authors

一般来说,分裂姓氏的问题是无法解决的,给定多字姓氏(例如冯诺依曼),以及“姓氏”在前的名字。启发式地,Lingua::EN::NameParse将进行尝试。(类似的模块可用于其他一些语言。)

于 2013-03-19T04:31:55.953 回答
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
于 2013-03-19T04:45:16.707 回答