как включить одинарные кавычки из пользовательского ввода в Perl - PullRequest
3 голосов
/ 04 июля 2011

Пользователь собирается ввести строку ввода, такую ​​как Tom's Toy.Однако скрипт perl жалуется, говоря «непревзойденный».

Это мой код.

my $commandline="";
while (@ARGV) {
  $_ = shift @ARGV;
  {$commandline .= $_ . ' ';}
}
print " Running $commandline\n";
system ($commandline);

Теперь, если пользовательский ввод - Tom's Toy.Я просто хочу напечатать Тома Той.Однако Perl жалуется на «непревзойденный».Если я не цитирую пользователя, он работает нормально.(например: Том Той - это хорошо) Как мне решить эту проблему.

Любая помощь очень ценится.Заранее спасибо

Ответы [ 3 ]

4 голосов
/ 04 июля 2011

Если вы немного переключитесь, чтобы использовать версию функции system $cmd, @args, оболочка не будет вызываться, поэтому экранирование не потребуется.

my $cmd = shift @ARGV;
my @args = @ARGV;
print " Running $cmd\n";

system $cmd, @args;

Я тестировал с ./test.pl echo Tom\'s Toy, и он дает ожидаемый результат:

 Running echo
Tom's Toy
2 голосов
/ 05 июля 2011

система (@ARGV), вероятно, все, что вам нужно.

Если вы укажете system () один аргумент, и , если этот аргумент содержит метасимволы оболочки (включая пробелы, кавычки и т. Д.), То аргумент будет передан оболочке. jwodder совершенно корректен: сообщение об ошибке приходит из оболочки, а не из Perl.

Если вы передаете system () несколько аргументов, это делается без вызова оболочки - что обычно лучше. Подход, который вы используете, принимает аргументы командной строки вашей программы, объединяет их в одну строку, а затем передает эту строку в оболочку, которая разделяет ее на несколько аргументов для выполнения.

С другой стороны, иногда вы можете хотеть вызвать оболочку, например, если вы создаете сложную команду с использованием каналов, перенаправления ввода-вывода и т. Д., И вы не ' Я не хочу устанавливать все это в Perl. Но вы должны быть осторожны с метасимволами, как вы видели.

"perldoc -f system" объясняет это более полно.

1 голос
/ 04 июля 2011

Если все, что вы хотите сделать, это напечатать обратно введенные пользователем данные, используйте print, а не system.system попытается передать предоставленную строку в оболочку для выполнения в виде команды, и именно эта оболочка жалуется на несопоставленную кавычку.

(Кроме того, вместо ручной конкатенации @ARGV, я могу направитьВаше внимание к функции join?)

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