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



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

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";都有纳达结果。

输入数据示例:

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

预期产出:

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

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

[^dNSEW.]+

正则表达式演示

示例来源:( 运行此处 )

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: %sn",
$deg, $min, $sec, $dir);

不管你喜不喜欢,Unicode 就是未来。

最新更新