Почему Perl заменит системный вызов # на% 23? - PullRequest
0 голосов
/ 15 августа 2011

Следующий код Perl не открывает URL-адрес, как ожидалось:

$word="中文";
my $url="http://www.google.com/#source=hp&q=" . $word;
print $url . "\n";
system("open \"$url\"");

Он открывает Google Chrome с URL:

http://www.google.com/%23source=hp&q=中文

вместо

http://www.google.com/#source=hp&q=中文

Если я заменим системный вызов на

system("echo \"$url\"");

, он напечатает правильный URL http://www.google.com/#source=hp&q=中文, который работает при вставке в поле URL Google Chrome.

Почему это так?Как это исправить?

[Редактировать 14 августа, 20: 30CDT]

Кажется, проблема в open.Ни одна из

open "http://www.google.com/#source=hp&q=中文"
open 'http://www.google.com/#source=hp&q=中文'
open http://www.google.com/#source=hp&q=中文

не работает.Все они по ошибке заменили # на %23.Интересно, что если я поставлю только 1 символ в запросе, т.е. использую «中» вместо «中文», я найду оба

open "http://www.google.com/#source=hp&q=中"
open 'http://www.google.com/#source=hp&q=中'

работы, но не

open http://www.google.com/#source=hp&q=中

Яс использованием Mac OS X 10.6.

1 Ответ

1 голос
/ 15 августа 2011

Прямой ответ на оригинальный вопрос: это не так. (Я не получаю кредит за это; ФП упомянул это при редактировании вопроса.)

Как сказал ОП при редактировании вопроса, это определенно команда open, а не Perl или system(), которая делает это (и использование одинарных, а не двойных кавычек не должно иметь никакого значения).

Обратите внимание, что open, похоже, относится только к MacOS (в моей системе Ubuntu есть команда open, но это не одно и то же). Вот справочная страница .

Часть объяснения состоит в том, что %23 является шестнадцатеричным представлением символа '#". URL-адреса обычно используют этот механизм для экранирования символов, которые иначе имели бы какое-то значение в URL-адресе Например, введя "foo#bar" в поле поиска google.com, получим этот URL: http://www.google.com/search?q=%22foo%23bar%22.

Вопрос в том, почему open заменяет '#' на %23, когда должно рассматриваться как метасимвол? Это может быть ошибка в open, или может быть способ обойти ее. Возможно, кто-то более знакомый с MacOS может помочь с этим.

Просто дикое предположение: что произойдет, если вы наберете

open 'http://www.google.com/\#source=hp&q=中文'

в командной строке?

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