Я должен выйти из аргументов оболочки в Perl?

   tweet.user.screen_name if tweet.user.screen_name.match('username2')

это соответствует любому регулярному выражению или строке в ()

Мой финал таков:

TwitterApi.client.search("to:username", result_type: "recent").take(10).collect do |tweet|
       tweet.user.screen_name if tweet.user.screen_name.match(/#{@record.username}/i)
end

Таким образом, результаты верны независимо от регистра без учета регистра [115 ]

14
задан brian d foy 5 February 2010 в 04:39
поделиться

2 ответа

Если Вы используете system $cmd, @args, а не system "$cmd @args" (массив, а не строка), то Вы не должны выходить из аргументов, потому что никакая оболочка не вызывается (см. система ). system {$cmd} $cmd, @args не вызовет оболочку также, даже если $cmd будет содержать метасимволы, и @args пуст (это документируется как часть [1 110] должностное лицо ). Если args прибудут из ввода данных пользователем (или другой недоверяемый источник), то Вы все еще захотите не испортить их. См. -T в perlrun документы, и perlsec документы.

, Если необходимо считать вывод или отправить вход в команду, qx и readpipe, не имеют никакого эквивалента. Вместо этого используйте open my $output, "-|", $cmd, @args или open my $input, "|-", $cmd, @args, хотя это не портативно, поскольку это требует реального fork, что означает Unix только... Я думаю. Возможно, это будет работать над Windows со своим моделируемым ветвлением. Более оптимальный вариант - что-то как [1 113] IPC:: Выполненный , который также обработает случай передачи по каналу команд к другим командам, которые не обработают ни форма мультиаргумента системы, ни 4 формы аргумента открытых.

37
ответ дан 1 December 2019 в 06:11
поделиться

В Windows ситуация немного более противна. В основном все программы Win32 получают одну длинную строку командной строки - оболочка (обычно cmd.exe) может сделать некоторую интерпретацию сначала, удаляя < и > перенаправления, например, но она делает не , разделяют ее на границах слова для программы. Каждая программа должна сделать этот парсинг себя (если они желают - некоторые программы не беспокоятся). В C и программах C++, стандартные программы, обеспеченные библиотеками времени выполнения, предоставленными набором инструментальных средств компилятора, будут обычно выполнять этот шаг парсинга, прежде чем main() будет назван.

проблема, в целом, Вы не знаете, как данная программа проанализирует свою командную строку . Много программ компилируются с некоторой версией MSVC ++, чей изворотливые правила парсинга описаны здесь , но многие другие компилируются с различными компиляторами, которые используют различные конвенции.

Это составлено тем, которое cmd.exe имеет его собственные изворотливые правила парсинга. Каре (^) рассматривают как символ ESC, который заключает следующий символ в кавычки, и текст в двойных кавычках рассматривают, как заключено в кавычки, если список хитрых критериев выполняется (см. cmd /? для полных окровавленных деталей). Если Ваша команда содержит какие-либо странные символы, это очень легко для cmd.exe, идея которого части текста "заключаются в кавычки" и которые не должны выходить из синхронизации с Вашей целевой программой, и весь ад вырывается на свободу.

Так, самый безопасный подход для выхода из аргументов в Windows:

  1. аргументы Escape, таким образом ожидаемые логикой синтаксического анализа командной строки программы, Вы звоните. (Надо надеяться, Вы знаете, какова та логика; в противном случае попробуйте несколько примеров и предположения.)
  2. Соединение завершенные споры с пробелами.
  3. Префикс каждый небуквенно-цифровой знак из получившей строки с ^.
  4. Добавляют любые перенаправления или другой обман оболочки (например, присоединяющиеся команды с &&).
  5. Выполнение команда с [1 110] или обратные галочки.
13
ответ дан 1 December 2019 в 06:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: