Разделение строки, содержащей выражение долготы или широты в 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.]+
Пример источника: ( бегите сюда)
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 - это будущее.