在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.]+
示例来源:( 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 就是未来。
我从包含真实测地线表达式的网络中检索数据,我指的是度、分和秒,带有 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.]+
示例来源:( 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 就是未来。