Как создать абсолютный URL из двух компонентов в Perl? - PullRequest
3 голосов
/ 28 ноября 2009

Предположим, у меня есть:

my $a = "http://site.com";
my $part = "index.html";
my $full = join($a,$part);
print $full;
>> http://site.com/index.html

Что я должен использовать как join, чтобы заставить мой фрагмент работать?

РЕДАКТИРОВАТЬ: Я ищу что-то более общее. Что если a заканчивается косой чертой, а part начинается с нее? Я уверен, что в каком-то модуле у кого-то есть это.

Ответы [ 5 ]

10 голосов
/ 28 ноября 2009

Я считаю, что вы ищете URI :: Split , например ::

use URI::Split qw(uri_join);
$uri = uri_join('http', 'site.com', 'index.html')
3 голосов
/ 24 сентября 2012
use URI;
URI->new("index.html")->abs("http://site.com")

будет производить

"http://site.com/index.html"

URI-> abs позаботится о правильном объединении путей в соответствии с вашей спецификацией uri,

так

URI->new("/bah")->abs("http://site.com/bar")

будет производить

"http://site.com/bah"

и

URI->new("index.html")->abs("http://site.com/barf")

будет производить

"http://site.com/barf/index.html"

и

URI->new("../uplevel/foo")->abs("http://site.com/foo/bar/barf")

будет производить

"http://site.com/foo/uplevel/foo"

в качестве альтернативы, в пространстве имен URI есть ярлык sub, который я только что заметил:

URI->new_abs($url, $base_url)

так

URI->new_abs("index.html", "http://site.com")

будет производить

"http://site.com/index.html"

и т. Д.

2 голосов
/ 29 ноября 2009

Нет необходимости в ‘join‘, просто используйте интерполяцию строк.

my $a = "http://site.com";
my $part = "index.html";
my $full = "$a/$part";
print $full;
>> http://site.com/index.html

Обновление:

Не все требует модуля. CPAN - это прекрасно, но нужна сдержанность.

Простой подход, описанный выше, работает очень хорошо, если у вас есть чистые данные. Если вам нужно обрабатывать неравномерно отформатированные строки, вам нужно как-то их нормализовать. Использование библиотеки в пространстве имен URI, которая отвечает вашим потребностям, вероятно, является наилучшим вариантом действий, если вам нужно обрабатывать ввод данных пользователем. Если разница незначительна File::Spec или небольшая ручная очистка может быть достаточно для ваших нужд.

my $a = 'http://site.com';
my @paths = qw( /foo/bar foo  //foo/bar );

# bad paths don't work:
print join "\n", "Bad URIs:", map "$a/$_", @paths;

my @cleaned = map s:^/+::, @paths;
print join "\n", "Cleaned URIs:", map "$a/$_", @paths;

Когда вам приходится работать с плохими вещами, такими как $path = /./foo/.././foo/../foo/bar;, это когда вы определенно хотите использовать библиотеку. Конечно, это можно решить с помощью функции канонического пути File::Spec.

Если вы беспокоитесь о плохих / причудливых вещах в URI, а не только о проблемах с путями (имена пользователей, пароли, странные спецификаторы протокола) или URL-кодировке строк, то использование библиотеки URI действительно важно и, безусловно, не является чрезмерным.

1 голос
/ 29 июня 2012

Поскольку я привык к методам Java java.net.URL, я искал аналогичный способ объединения URI без каких-либо предположений относительно схемы, хоста или порта (в моем случае это возможно для сложного URL Subversion):

http://site.com/page/index.html
 +  images/background.jpg
=>  http://site.com/page/images/background.jpg

Вот способ сделать это в Perl:

use URI;
my $base = URI->new("http://site.com/page/index.html");
my $result = URI->new_abs("images/background.jpg", $base);
1 голос
/ 18 ноября 2011

Возможно, вы захотите взглянуть на это, реализацию функции, похожую на urljoin Python, но в Perl:

http://sveinbjorn.org/urljoin_function_implemented_using_Perl

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...