我有一个称为($ 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)
正在寻找有关实现目标的建议。
答案 0 :(得分:8)
这里的问题是您试图在-
上进行拆分(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”属性的字符类:
my ($StartDate, $EndDate) = split /\p{Dash}/, $date;
请注意,@dates[0]
将触发警告(如果启用了use warnings
,因为应该在Perl中将数组@foo
的单个元素拼写为$foo[0]
。语法@array[ LIST ]
用于数组切片,即按其索引提取多个元素。