更适合弦乐; substr()或split()

时间:2013-03-19 04:21:49

标签: perl

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

  

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?以下是关于我的阵列的一些值得注意的事项:

  • 每一行都有一个作者姓名,第一个和最后一个,有时也有一个 中间的初始或Sr./Jr。
  • 如果该行只有两位作者,则他们会被一个空格隔开 单词“和”。(见上例)
  • 如果该行有两个以上,则每个元素都用逗号分隔 最后一个前面加上“和”一词。
  • 如果该行只有一位作者没有标点符号或者需要“和”这个词。

我想指出我对Perl还不熟悉,但我来自C ++,所以我对计算机逻辑有所了解。说到这一点,我想我知道两者是如何工作的,但我只是想得到一个更熟悉的人的意见,如果其中任何一个比另一个好。我知道计算机代码适用于那些实际上没有的模式。

2 个答案:

答案 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