2012-01-05 4 views
1

두 날짜 사이의 초를 얻기 위해 GNU Date를 사용하려고합니다. GNU Date를 사용하는 이유는이 목적으로 퍼포먼스 (테스트에서 Perl보다 10 배 빠름) 때문입니다. 그러나, 나의 주장 중 하나는 perl 변수이다. 이와 같이 :Bash 명령어의 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 명령의 출력을 캡처해야한다는 것입니다. 당신이 사용하기 때문에 '의

+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 : 예기치 않은 토큰 근처에서 구문 오류가 발생했습니다.'(' sh : -c : 줄 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))) ' – 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 도구를 모두 사용하여 스칼라를 구성 할 수 있습니다. 이를 수행하는 한 가지 방법은 다음과 같습니다.