• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:shとperlのデータ連携&perl出力)

shとperlのデータ連携&perl出力

このQ&Aのポイント
  • UNIX環境でシェルで日付差分を求めるために、shとperlを連携させる方法
  • perlで実行されたシェルの引数を受け取り、日付の差分を計算しファイルに出力する方法
  • シェル実行時にエラーが発生せず、ファイルの出力もされない問題の原因と解決方法

質問者が選んだベストアンサー

  • ベストアンサー
  • hyter
  • ベストアンサー率73% (31/42)
回答No.1

載せていただいたコードを元に作ってみました。(簡略化しています) ■動作確認をしたコード============ #!/usr/bin/perl use Time::Local; use warnings; #--------------------- # 引数の取得とか #--------------------- $L_Year = int(substr($ARGV[1],0,4)); $L_Mon = int(substr($ARGV[1],4,2)); $L_Day = int(substr($ARGV[1],6,2)); $L_Hour = int(substr($ARGV[1],8,2)); $L_Min = int(substr($ARGV[1],10,2)); $L_Sec = int(substr($ARGV[1],12,2)); $outfile = "./result.txt"; #--------------------- # 差分を取得 #--------------------- $L_Time1 = timelocal($L_Sec, $L_Min, $L_Hour, $L_Day, $L_Mon - 1, $L_Year); $L_Time2 = timelocal($L_Sec, $L_Min, $L_Hour, $L_Day + 1, $L_Mon - 1, $L_Year); $L_TimeRet = ($L_Time2 - $L_Time1); #--------------------- # 差分をファイルに出力 #--------------------- open (OUT,"> $outfile"); if($ARGV[0] == 1){ $L_LET = int($L_TimeRet / (60 * 60 * 24)); print OUT "$L_LET"; } elsif($ARGV[0] == 2){ $L_LET = $L_TimeRet; print OUT "$L_LET"; } close(OUT); ====================== ■気になったところ ・OUT "$outfile" だとファイルのパスをファイルに書きこむ?$L_LETの間違い? ・$outfile(書き込むファイルのパス)が定義されていない? use warnings; を始めに宣言しておくと、エラー部分を教えてくれますよ。

chabakof
質問者

お礼

回答ありがとうございます。参考にさせて頂きました。 perlのUNIXTIME処理を使用するには、 シェルでtimelocal関数を呼び出し、以下のように実行すればOKでした。 例. perl -e 'use Time::local;$unixtime=timelocal('&sec','$min','$hour','$day','$(expr $month - 1)', '$(expr $year -1900)',0,0,0);print $unixtime' tounixtimeを呼び出す際に、引数をそれぞれ設定するとUNIXTIMEが取得できます。 後は日付1、日付2をそれぞれUNIXTIMEに変換して、マイナスすれば OKでした。 丁寧な回答ありがとうございます。 またよろしくお願いしますね。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

・open (OUT,"> $outfile"); 作成できたかどうかのチェックが無い。 print OUT "$outfile";; という「ファイル名を出力」というのも成功していないようなので、たぶん、openに失敗している

chabakof
質問者

お礼

回答ありがとうございました。 ファイルのチェックは入れているので、それ以外が問題でした。

関連するQ&A