передача аргументов командной строки с оператором точки - PullRequest
1 голос
/ 25 октября 2011

Я пытался разобрать один из веб-сайтов, при этом мне нужно передать

$url="http://www.hotels.com/search/search.html?destinationName=Dallas%2C+Texas%2C+United+States&arrivalDate=10%2F27%2F11&departureDate=10%2F31%2F11&numberOfRooms=1&numberOfAdults=1";
system("perl x.pl $url"); // this is giving me error because the $url consists of dot operator.

Ответы [ 2 ]

7 голосов
/ 25 октября 2011

Мульти-аргумент из system() лучше в этом случае:

system('perl', 'x.pl', $url);

Когда вы передаете system() единственную строку, содержащую метасимволы оболочки (включая пробелы), она вызывает ее через /bin/sh (по крайней мере, в Unix-подобных системах) - это означает, что такие вещи, как символ & будут интерпретироваться оболочкой, если (как подсказывает @MikePlayle) вы не цитируете ее.

Но когда вы даете system() несколько аргументов, он обходит оболочку и выполняет команду, указанную в первом аргументе, напрямую, передавая ей другие аргументы.

Форма с одним аргументом полезна, когда вы хотите, чтобы оболочка обрабатывала метасимволы - например, если вы хотите сделать перенаправление ввода-вывода (включая каналы) и / или подстановочные знаки, то, что может сделано в Perl, но с чуть большим усилием.

perldoc perlfunc и найдите «system» для получения дополнительной информации, или см. Здесь .

1 голос
/ 25 октября 2011

Возможно, вам нужно поместить кавычки вокруг URL-адреса, чтобы оболочка не пыталась его интерпретировать.

Попробуйте что-то вроде

system("perl x.pl \"$url\"");

или любой другой синтаксис Perl для кавычек.Я уверен, что кто-то исправит меня, если я ошибаюсь.

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