如何在perl中拆分包含连字符的字符串

How to split a string containing a hyphen in perl

我有一个名为 ($date) 的字符串,我试图使用 Perl 将其分成两部分。

$date= (June 25, 2018–July 1, 2018)

根据我的阅读,将此字符串拆分为两个单独日期的正确方法似乎是创建一个新数组,使用带有连字符作为分隔符的 Perl split() 函数,然后分配我的 StartDate/EndDate 变量的数组索引值是这样的...

@dates = split(/-/, $date);
  $StartDate = @dates[0];
  $EndDate = @dates[1];

print "Effective Date: ($date)\n";
print "($StartDate)";
print "\n";
print "($EndDate)";

然而,这并没有像我预期的那样工作。

请记住,上面的代码只是源代码的一小部分。

Current Output (Incorrect)

Effective Date: (June 25, 2018–July 1, 2018)
(June 25, 2018–July 1, 2018)
()

预期输出(正确)

Effective Date: (June 25, 2018–July 1, 2018)
(June 25, 2018)
(July 1, 2018)

正在寻找有关如何实现我的目标的任何建议。

这里的问题是您试图在 - (U+002D HYPHEN-MINUS) 上拆分,但您的字符串包含 (U+2013 EN DASH)。

您可以通过多种方式在正则表达式中指定此字符:

use utf8;
...
my ($StartDate, $EndDate) = split /–/, $date;

use utf8 告诉 perl 你的源代码是 UTF-8,所以你可以按字面意思使用 Unicode 字符。

my ($StartDate, $EndDate) = split /\x{2013}/, $date;

或者您可以使用十六进制字符代码。

my ($StartDate, $EndDate) = split /\N{EN DASH}/, $date;

或命名字符引用。

如果您不一定要在 EN DASH 上拆分而是任何类似破折号的字符,您可以使用基于 "Dash" 属性 的字符 class:

my ($StartDate, $EndDate) = split /\p{Dash}/, $date;

请注意 @dates[0] 将触发警告(如果 use warnings 已启用,它应该是)因为数组 @foo 的单个元素拼写为 $foo[0]在 Perl 中。语法 @array[ LIST ] 用于数组切片,即通过索引提取多个元素。