2012-01-05 12 views
1

私はGNU Dateを使って2つの日付の間の秒を取得しようとしています。私がGNU Dateを使用している理由は、この目的のためにパフォーマンス(テストではPerlよりも10倍高速でした)です。しかし、私の議論の一つはperl変数です。このように:Perlの文字列補間(Bashコマンド)

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)を1つ試して、バックティックなどを調整しようとしました。成功しませんでした。主なことは、bashコマンドの出力をキャプチャする必要があることです。あなたが使用しているためだ

+0

4つのプロセスを開始するより10倍遅くなったPerlで計算を行っていましたか?私はそれがより効率的に行うことができると思う。 – cjm

答えて

0

':

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

Arkadiy、ご返信ありがとうございます。 sh:-c:行0:予期しないトークンの近くで文法エラーが発生しました '( ' sh:-c:行0:' CUR_DATE = 'echo 0 0date +"%F%T ") ';エコー0 0(0 0date -d "" +%s)-0 0date -d "2012年1月5日20時20分22秒)) ' – user1130364

+0

これは、( ))を計算します。 – user1130364

+0

おそらく、%sをハッシュとして解釈しています。代わりに\%を使用してください。 – Arkadiy

1

は自分にそれが簡単に作成し、シェルで作業の最小量を行います。これは私の作品:

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

qxには、文字列を補間するかどうかのオプション(区切り文字として'を選択)を含む便利な区切り文字を選択できるという特徴があります。このユースケースでは、補間が必要な場合もありますが、しばしばそうしない場合があります。そのため、qx(およびバッククォート)が適切なツールではない可能性があります。

readpipeおそらく良いツールです。 system EXPRコマンドと同様に、それは入力として任意のスカラーを受け取り、そのスカラーを構築するために自由にPerlのツールを利用することができます。これを行う1つの方法は次のとおりです:

​​
関連する問題