在perl中拆分包含经度或纬度表达式的字符串

Splitting a string containing a longitude or latitude expression in perl

我从包含真实测地线表达式的网络中检索数据,我指的是度、分和秒,带有 Unicode 符号:U+00B0, U+2032 and U+2033,名为 Degree、Prime 和 Double Prime。示例:

my $Lat = "48° 25′ 43″ N";

我的 objective 是先将这样的表达式转换为度数,然后再转换为弧度,以便在我正在编写的 Perl 模块中使用,该模块实现 Vincenty 逆公式来计算椭圆体大圆距离。我的所有代码 objective 都遇到了伪测地线,例如“48:25:43 N”,当然,这是手输入的测试数据,而不是真实世界的数据。我正在努力制作一个正则表达式来分割这些真实数据,就像我现在分割伪数据一样,如:

my ($deg, $min, $sec, $dir) = split(/[\s:]+/, $_[0], 4); # this works

我试过很多正则表达式,包括

/[°′″\s]+/ and
/[\x{0B00}\x{2032}\x{2033}\s]/+

结果都令人沮丧,例如$deg = "48?", $min = "?", $sec = "25′43″ N" and $dir = undef。我已将代码封装在大括号 {} 内,并包含在该范围内使用 utf8;并使用功能 'unicode_strings';所有结果都没有。

输入数据示例:

my $Lat = "48° 25′ 43″ N"; 

预期输出:

$deg = 48, $min = 25, $sec = 43 and $dir = "N"

您可以试试这个正则表达式来拆分字符串:

[^\dNSEW.]+

Regex Demo

示例来源:( run here )

my $str = '48° 25′ 43″ N';
my $regex = qr/[^\dNSEW.]+/p;
my ($deg, $min, $sec, $dir) = split $regex, $str;

我的错!飞行员失误!

我发布的原始正则表达式是:

/[\x{0B00}\x{2032}\x{2033}\s]/+

错误是我放置“+”字符和度数字符的十六进制值的位置。该正则表达式应该写成:

/[\x{B0}\x{2032}\x{2033}\s]+/

@Rizwan 的回答很有启发性,但我决心让 Perl 中的正则表达式与 Unicode 兼容,所以我坚持了下来,现在这是我的解决方案:

use utf8;
no warnings;

my $dms = "48° 25′ 43.314560″ N";
my $regex = qr/[\x{B0}\x{2032}\x{2033}:\s]+/p; # some geodesics do use ':'
my ($deg, $min, $sec, $dir) = split $regex, $dms;
printf("$deg: %s, $min: %s, $sec: %s, $dir: %s\n",
       $deg, $min, $sec, $dir);

不管喜欢与否,Unicode 就是未来。