2

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

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

我的目标是首先将这样的表达式转换为度数,然后再转换为弧度,以便在我正在编写的 Perl 模块中使用,该模块实现了 Vincenty 逆公式来计算椭圆体大圆距离。我所有的代码目标都满足了伪测地线,例如“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”;所有这些都带有 nada 结果。

输入数据示例:

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

预期输出:

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

2 回答 2

4

您可以尝试使用此正则表达式来拆分字符串:

[^\dNSEW.]+

正则表达式演示

示例来源:(在此处运行

my $str = '48° 25′ 43″ N';
my $regex = qr/[^\dNSEW.]+/p;
my ($deg, $min, $sec, $dir) = split $regex, $str;
于 2018-01-31T06:38:58.040 回答
0

我的错!飞行员失误!

我发布并苦苦挣扎的原始正则表达式是:

/[\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 就是未来。

于 2018-02-02T01:34:52.950 回答