電子書籍の厳選無料作品が豊富!

初めて記載します。宜しくします。
perlでプログラムするのが初めてでなので、大分間違ってるかもしれません。
※UNIX環境でシェルで日付差分(yyyymmddhhmmss)を求めたいのですが、「date -d」コマンドは使用出来ません。

シェルを実行しコマンドラインにて入力された【引数1】:実行区分(1 or 2)【引数2】:日付(yyyymmddhhmmss)、【引数3】:日付(yyyymmddhhmmss)と区分をperlに引数として渡して、perlでは"引数3-引数2"をして日数を算出しファイルに出力させたいです。
perl名:MCPFZAR_Compl.pl
実行コマンド例: perl MCPFZAR_Compl.pl 1 20110302000000 20110306000000


以下にperlのプログラムを掲載します。
#!/opt/perl/bin/perl
⇒入力パラメータチェック実行
# 日付1を年、月、日、時、分、秒に切り分け
$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));
# 取得日付チェック関数を実行する。
($L_Ret, $L_Ret_Msg) = &MCPFLCF_DayExists($L_Year, $L_Mon, $L_Day, $L_Hour, $L_Min, $L_Sec);
# 異常終了した場合
if( $L_Ret != 0 ){
# エラーを返却する。
return ($L_Error_End, "$L_Err_MSG_4 [$L_Ret_Msg]");
}
# 日付1を秒に変換
$L_Time1 = timelocal($L_Sec, $L_Min, $L_Hour, $L_Day, $L_Mon - 1, $L_Year);

⇒同様に日付2も変換

# 日付1と日付2の差分を取る。
$L_TimeRet = ($L_Time2 - $L_Time1);

# ファイルに書き込む為に、ファイルopenしてから書込み
open (OUT,"> $outfile");


# 結果形式種別が1の場合
if($ARGV[0] == 1){
# 結果を日数で参照渡しする。
$L_LET = int($L_TimeRet / (60 * 60 * 24));
print OUT "$outfile";

}

# 結果形式種別が2の場合
elsif($ARGV[0] == 2){
# 結果を秒で参照渡しする。
$L_LET = $L_TimeRet;
print OUT "$outfile";;
# CLOSEする
close(OUT);

シェルを実行すると、エラーにはなりませんが
ファイルの出力もされません。

かなりどうしたらよいかわからない状態なので回答宜しくお願い致します。
足りない情報がありましたらご教授願います。

A 回答 (2件)

載せていただいたコードを元に作ってみました。

(簡略化しています)

■動作確認をしたコード============
#!/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; を始めに宣言しておくと、エラー部分を教えてくれますよ。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。参考にさせて頂きました。

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でした。

丁寧な回答ありがとうございます。
またよろしくお願いしますね。

お礼日時:2011/03/25 13:41

・open (OUT,"> $outfile");



作成できたかどうかのチェックが無い。
print OUT "$outfile";;
という「ファイル名を出力」というのも成功していないようなので、たぶん、openに失敗している
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/03/25 16:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!