【问题标题】:Perl String Interpolation in Bash CommandBash 命令中的 Perl 字符串插值
【发布时间】:2012-01-05 21:17:20
【问题描述】:

我正在尝试使用 GNU Date 来获取两个日期之间的秒数。我使用 GNU Date 的原因是为了性能(在测试中比 Perl 快 10 倍)。但是,我的论点之一是 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),尝试调整反引号等。没有成功,任何想法如何适当地做到这一点?主要是我需要捕获 bash 命令的输出。

【问题讨论】:

  • 你是如何在 Perl 中进行计算的,结果比启动 4 个进程慢 10 倍?我怀疑它可以更有效地完成。

标签: perl


【解决方案1】:

让自己更轻松,在 shell 中做最少的工作。这对我有用:

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 中没有任何 shell 元字符。

【讨论】:

    【解决方案2】:

    那是因为你使用 ' :

               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 $$
    

    【讨论】:

    • Arkadiy,感谢您的回复。我之前试过,我得到这个错误: sh: -c: line 0: syntax error near unexpected token (' sh: -c: line 0: CUR_DATE=echo 0 0date +"%F %T") ; echo 0 0(0 0date -d "" +%s)-0 0date -d "2012-01-05 20:20:22" +%s)))'
    • 日期计算中处理(())好像有问题。
    • 它可能将 %s 解释为哈希。请改用 \%。
    【解决方案3】:

    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
    

    【讨论】:

      猜你喜欢
      • 2012-12-08
      • 1970-01-01
      • 2016-05-19
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多