Разделение строки, содержащей выражение долготы или широты в perl

Я получаю данные из сети, содержащей реальные геодезические выражения, под которыми я подразумеваю градусы, минуты и секунды с символами Unicode: U+00B0, U+2032 and U+2033, названный Степень, Премьер и Двойной Премьер. Пример:

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

Моя цель - преобразовать такое выражение сначала в градусы, а затем в радианы для использования в модуле Perl, который я пишу и который реализует обратную формулу Винсенти для вычисления эллипсоидальных расстояний большого круга. Все мои цели кода были выполнены с помощью псевдогеодезических, таких как "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"

2 ответа

Решение

Вы можете попробовать это регулярное выражение, чтобы разбить строку:

[^\dNSEW.]+

Regex Demo

Пример источника: ( бегите сюда)

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 - это будущее.

Другие вопросы по тегам