初めて記載します。宜しくします。
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);
シェルを実行すると、エラーにはなりませんが
ファイルの出力もされません。
かなりどうしたらよいかわからない状態なので回答宜しくお願い致します。
足りない情報がありましたらご教授願います。
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; を始めに宣言しておくと、エラー部分を教えてくれますよ。
回答ありがとうございます。参考にさせて頂きました。
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でした。
丁寧な回答ありがとうございます。
またよろしくお願いしますね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NETからPerlを呼び出す
-
DBIのupdateのプレースフォルダ
-
「デバイスは PRN を初期化でき...
-
LCD ディスプレイを Raspberry ...
-
perlについて
-
Spreadsheet::ParseExcelを使っ...
-
Pg.pmモジュールがロードできない
-
EXECEL VBA コマンドボタンか...
-
Excel VBA 『Call』で呼び出す...
-
【ExcelVBA】commandButtonをク...
-
VBAで2重のDoLoop関数から抜け...
-
例外処理のフローチャートの記...
-
vba userFormのSubを標準モジュ...
-
エクセルVBAでシートモジュール...
-
他Book(シートモジュール)のマ...
-
VBでグローバル変数を宣言するには
-
VBA モジュールを閉じるショー...
-
Cからシェルを起動し返り値をハ...
-
警告を消したい
-
エクセルVBA クラスモジュール...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlソースコードをコンパイル...
-
プロシージャの戻り値を取得す...
-
Perlで環境変数を設定するには
-
system関数でCシェルコマンドを...
-
cgiを実行可能にするには
-
外部CGIの実行結果を変数内に取...
-
UNIX SUN Solarisで時間の演算
-
VB.NETからPerlを呼び出す
-
Cygwin上でperlスクリプトの実行
-
system関数を使用してJava実行...
-
これをビジュアルスタジオで実...
-
Perlスクリプトが実行できない...
-
-i -e "s|^.|ok|" ./text どこ...
-
perlで 引数1を別リストの複数...
-
Apacheのログからアクセス履歴...
-
Perl リスト内指定回数繰り返し
-
DBIのupdateのプレースフォルダ
-
Windows版Perlの標準入力&標準...
-
コードを一行ずつ実行したい。
-
例外処理のフローチャートの記...
おすすめ情報