Perl String Interpolation в команде Bash - PullRequest
1 голос
/ 06 января 2012

Я пытаюсь использовать GNU Date, чтобы получить секунды между двумя датами. Причина, по которой я использую GNU Date, заключается в производительности (в тестировании было в 10 раз быстрее, чем в Perl). Тем не менее, один из моих аргументов - переменная perl. Как это:

my $b_row="2012-01-05 20:20:22";
my $exec =qx'CUR_DATE=`echo $(date +"%F %T")` ; echo $(($(date -d  "$CUR_DATE" +%s)-$(date -d  "$b_row" +%s)))';

Проблема в том, что b_row не расширяется. Я пробовал пару разных решений (IPC :: System :: Simple), пытался настроить backticks и т. Д. Безуспешно, есть идеи, как сделать это соответствующим образом? Главное, мне нужно захватить вывод команды bash.

Ответы [ 3 ]

1 голос
/ 06 января 2012

Облегчите себе и сделайте минимальный объем работы в оболочке.Это работает для меня:

my $b_row = '2012-01-05 20:20:22';

my $diff = qx(date -d "\$(date +'%F %T')" +%s) -
           qx(date -d            "$b_row" +%s);

Просто убедитесь, что $b_row не содержит метасимволов оболочки.

0 голосов
/ 06 января 2012

qx имеет функцию, позволяющую выбрать удобный разделитель, включая возможность интерполировать строку или нет (выбрав ' в качестве разделителя). Для этого варианта использования иногда требуется интерполяция, а иногда нет, поэтому qx (и обратные метки) могут оказаться неподходящим инструментом для работы.

readpipe, вероятно, лучший инструмент. Как и команда system EXPR, она принимает произвольный скаляр в качестве входных данных, и у вас есть все инструменты Perl для его создания. Один из способов сделать это:

my $exec = readpipe 
    'CUR_DATE=`echo $(date +"%F %T")` ;'   # interp not desired
    . ' echo $(($(date -d  "$CUR_DATE" +%s)-$(date -d  "'
    . qq/"$b_row"/                         # now interp is desired
    . ' +%s)))';                           # interp not desired again
0 голосов
/ 06 января 2012

Это потому, что вы используете ':

           Using single-quote as a delimiter protects the command from
           Perl's double-quote interpolation, passing it on to the shell
           instead:

               $perl_info  = qx(ps $$);            # that's Perl's $$
               $shell_info = qx'ps $$';            # that's the new shell's $$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...