Как сделать экранирование в этом Perl-коде? - PullRequest
3 голосов
/ 26 августа 2011
#!/usr/bin/perl
use warnings;
system ("dialog --menu Customize 10 70 50 'Flush rules' 'Clear all the rules' 'Show rules' 'Shows the current rules' 2> /tmp/tmp.txt ")

Я хочу написать приведенный выше код в более удобочитаемой форме, например:

#!/usr/bin/perl
use warnings;
system ("dialog --menu Customize 10 70 50 
'Flush rules' 'Clear all the rules' 
'Show rules' 'Shows the current rules' 
'more options' '........' 2> /tmp/tmp.txt ")

Как я могу это сделать?

Ответы [ 3 ]

5 голосов
/ 26 августа 2011

Perl предоставляет оператор конкатенации строк, который вы можете использовать для создания больших строк:

system ( "dialog --menu Customize 10 70 50 "
       . "'Flush rules' 'Clear all the rules' "
       . "'Show rules' 'Shows the current rules' "
       . "'more options' '........' 2> /tmp/tmp.txt ");
2 голосов
/ 26 августа 2011

system может принимать @args (форма массива):

system ( 'dialog', @args );
1 голос
/ 26 августа 2011
system ( "dialog --menu Customize 10 70 50 "
   . "'Flush rules' 'Clear all the rules' "
   . "'Show rules' 'Shows the current rules' "
   . "'more options' '........' 2> /tmp/tmp.txt ");

Черт, tadmc быстро. Да, используйте команду конкатенации ..

Я бы порекомендовал вам создать свою команду в отдельной строке и затем выполнить ее. Я также рекомендую использовать команду qq для цитирования. Таким образом, вам не нужно беспокоиться об одинарных или двойных кавычках:

my $command = qq(dialog --menu Customize 10 70 50 )
   . qq("Flush rules" 'Clear all the rules' )
   . qq('Show rules' 'Shows the current rules' )
   . qq'more options' '........' 2> /tmp/temp.$$ );

my $error = system $command;

Использование qq позволяет вам не беспокоиться о том, нужно ли мне использовать двойные кавычки для интерполяции переменных или одинарных кавычек или необходимость экранировать кавычки. Например, мне удалось смешать двойные и одинарные кавычки, и я могу использовать переменные Perl, не беспокоясь о том, нужно ли мне переходить с одинарных на двойные кавычки. Например, я использую /tmp/temp.$$. $$ - это идентификатор процесса, поэтому, если эта команда выполняется дважды, используются два разных временных файла.

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

Кстати, вы всегда должны проверять возвращение вашей команды system. Вероятно, есть хороший шанс, что если по какой-то причине вы не сможете выполнить системную команду, вы, вероятно, захотите выполнить ошибку или хотя бы заметить проблему.

Одна из проблем заключается в том, что вывод системной команды противоположен большинству функций Perl. В большинстве функций Perl возврат нуля указывает на сбой, а возврат ненулевого указывает на успех. Однако функция system является полной противоположностью. Ноль означает успех, не ноль означает неудачу.

Это может привести к странным конструкциям:

if (system $command) {
    die qq(Can't execute command "$command"\n);
};

Похоже, я говорю, что, если моя системная команда выполнена успешно, я должен умереть, но на самом деле это означает то же, что и это:

my $error = system $command;

if ($error) {
   die qq(Can't execute command "$command"\n);
}

Это синтаксически имеет гораздо больше смысла.

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