【先着1,000名様!】1,000円分をプレゼント!

いつもお世話になります。
ファイルに記述された日付に7日を加算した値とlocationtimeで取得した値を比較したいのですが、記述方法が分かりません。
<ファイルは下記のようになっております。>
2006<>03<>28<>明細
これに7を加算した(7日後という意味です)locationtimeでreturn "$year/$mon/$day";の戻り値と比較した比較したいのですが、
どのようにしたらよいのでしょうか?
どなたかご教示お願いいたします。

A 回答 (5件)

# あ、こういうことですか?


# まだ違ってたりして・・

use strict;

my $date1='20060328';
my $date2='2006/04/05';
$date2=~ s{\/}{}g;

if($date1 <= $date2){
print '$date1 <= $date2';
}else{
print 'else';
}

この回答への補足

SE-1様ありがとうございます。ご面倒かけて申し訳ありません。参考になりました。

補足日時:2006/04/12 08:41
    • good
    • 1

# これでいいでしょうか・・



use strict;

my $date1='2006/03/28';
$date1=~ s{\/}{}g;
my $date2='2006/04/05';
$date2=~ s{\/}{}g;

if($date1 <= $date2){
print '$date1 <= $date2';
}else{
print 'else';
}
    • good
    • 0

すいません、locationtime ってなんですか?

    • good
    • 0

# こんなんどうでしょう。



use strict;
use Time::Local;

my $date_info = <DATA>;
my @date_infos = split /<>/, $date_info;
my ($year,$mon,$day) = ($date_infos[0]-1900,$date_infos[1]-1,$date_infos[2]);

my ($sec,$min,$hour)= (localtime(time))[0..2];

my $time2 = timelocal ($sec,$min,$hour,$day,$mon,$year);
$time2 = $time2 + 7*24*60*60;

if (time<$time2){
print "New file.\n";
}else{
print "Old file.\n";
}

__DATA__
2006<>03<>28<>明細

この回答への補足

SE-1様回答が遅くなり大変申し訳ありません。ロジック参考にさせて頂きました。ちなみに単純に入力されたデータ(2006/03/28->20060328)と(2006/04/05->2006/04/05)を比較する事は可能でしょうか?
例$date1="20060328"
$date2="20060405"
if($date1 <= $date2){
適切な処理
}

ご面倒ですが、補足願えればと思います。

補足日時:2006/04/05 09:40
    • good
    • 0

がると申します。


日付のみで時間を気にせずにその大小をひかくしたいのであれば、「ユリウス暦」という便利なものがありますので、一度調べてみてください。
一度作って関数化しておくと便利ですよ。
http://homepage1.nifty.com/manome/astrology/juli …
    • good
    • 0
この回答へのお礼

galluda様回答が遅くなり大変申し訳ありません。
参考にさせて頂きました。他の方に補足質問させていただきましたが、単純に入力されたデータ(2006/03/28->20060328)と(2006/04/05->2006/04/05)を比較する事は可能でしょうか?
例$date1="20060328"
$date2="20060405"
if($date1 <= $date2){
適切な処理
}
また文字列を数値で比較する場合は""を外した状態で代入すればよいのでしょうか?(基本を忘れてます。申し訳ありません。)
ご面倒ですが、補足願えればと思います。

お礼日時:2006/04/05 09:46

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q日付形式の変換

はじめまして
Perlで日付形式の変換をしたいと思っています。
RFC1123形式(2 Mar 2006 04:28:25 -0800)から
yyyy/mm/dd hh:mm:ssの形式に変換したいのです。
色々と調べましたが、適当なヒントがあるところがありません
でした。
どうぞ、関連サイトでも構いませんので、ご回答お願いいたします。

Aベストアンサー

CPAN Date::Manip モジュールを使うといいかも
----------------------------------------------------------------
use Date::Manip;
Date_Init("TZ=JST");
$RFC1123 = "2 Mar 2006 04:28:25 -0800";

$date = ParseDate($RFC1123);
if( !$date){
print "error";
} else {
print UnixDate($date,"%Y/%m/%d %H:%M:%S");
}
#result>2006/03/02 21:28:25

QPerl 時間同士の差

恐れ入ります。
Perlを使って、時間と時間の差を求めたいのですが、
なかなかうまくいきません。

一度、txtファイルに書き込み日時を保存したあと、
それをperlにて読み込み、現在時刻との差を出して投稿制限を掛けたいのですが、
どのようにしたらよろしいでしょうか。

現在書き込み日時はtxtファイルに保存し、cgiファイル上に、出力済みで、localtimeも出力済みです。
単純に引いて関数に代入しても、正しい時間を得られません。

よろしくお願いします。

Aベストアンサー

まず、次の点を意識してください。
○ Perlにとっては、それは「ただの文字列」であって、「時刻」などではない
○ 文字列を数値演算しようとすると、「先頭の数値と見做せる箇所」が表す数値に変換される

$ip[1]='2013-02-12 17:03:45'
$time='2013-02-12 20:27:26'
の場合
$time=$time-$ip[1];
これは
・ - による数値演算 → 両辺は数値と見做す
・ '2013-02-12 20:27:26' → これは只の文字列。先頭の2013だけが数値と見做せるので、 2013 という数値に変換
・ '2013-02-12 17:03:45' → これは只の文字列。先頭の2013だけが数値と見做せるので、 2013 という数値に変換
→$time= 2013 - 2013 = 0
となり、その「0」と出力されるのが「Perlとして正しい動作」です。


日付の計算をしたいのなら
○DateTimeモジュール等を利用する
○$ip[1]を分解して、timelocal等で epoch秒を計算、 localtimeと比較する
○$ip[1]を分解して、$sec,$min,$hour,$mday,$mon,$yearとそれぞれ比較、集計して差を求める
等の手段を使う必要があります。

まず、次の点を意識してください。
○ Perlにとっては、それは「ただの文字列」であって、「時刻」などではない
○ 文字列を数値演算しようとすると、「先頭の数値と見做せる箇所」が表す数値に変換される

$ip[1]='2013-02-12 17:03:45'
$time='2013-02-12 20:27:26'
の場合
$time=$time-$ip[1];
これは
・ - による数値演算 → 両辺は数値と見做す
・ '2013-02-12 20:27:26' → これは只の文字列。先頭の2013だけが数値と見做せるので、 2013 という数値に変換
・ '2013-02-12 17:03:45' → これは只の文字列。先頭の...続きを読む

Qperlで配列の要素が空なのを知るには?

教えてください。

例えば、perlの次の様な要素が3つある配列で、

@t = ('A',,'C');

2要素目が空で有ることを判別したいのですが、どうしたら良いでしょうか?

Aベストアンサー

'' と比較する.

Q数値かどうかの判定方法

$aに代入されているものが数値かどうかを判定するにはどのようにしたらよいのでしょうか?

Aベストアンサー

$a =~ /^[0-9]*$/
上記の場合、*は「直前のパターンの0回以上の繰り返し」の意味なので、0から9がなくても、つまり$aが空でもマッチしてしまいます。
なので、
$a =~ /^[0-9]+$/
としましょう。
(+は「直前のパターンの1回以上の繰り返し」)
また、0-9は\dで表すこともできるので
$a =~ /^\d+$/
と書くこともできます。

Q日付の差を求める関数はないでしょうか。

日付の差を求める関数はないでしょうか。
SQLのDATEDIFFのような単純明快な関数があればいいなぁと思っています。
できれば、Perlの組み込み関数か、標準モジュールで・・・x_x

Aベストアンサー

標準モジュールTime::Localに含まれるtimelocal()を使うと、自作サブルーチンで簡単に実現できます。
timelocal()は組み込み関数localtime()の逆関数です。年月日時分秒からエポック秒(1900/01/01 00:00:00 GMTからの秒数)を求めることができます。

use Time::Local;

sub date_diff {
my($year1, $mon1, $mday1, $year2, $mon2, $mday2) = @_;
return((timelocal(0, 0, 0, $mday2, $mon2 - 1, $year2 - 1900) - timelocal(0, 0, 0, $mday1, $mon1 - 1, $year1 - 1900)) / (24 * 60 * 60));
}

print date_diff(2000, 1, 1, 2010, 6, 24); # 2000/01/01から2010/06/24までの日数差

Q複数ファイルの読み込みについて

perl初心者です。

あるディレクトリから拡張子がdataであるファイルを全て読み込みたいのですが、方法がわかりません。
cshで書くと
foreach arg (*.data)
コマンド $arg

のようになりますが、perlだと
foreach $arg (@arg){
コマンド $arg

となりますよね?
引数がリストなのでよくわかりません。
そもそもperlではできないのでしょうか?


それともう一点ですが、ファイルオープンするときに
foreachループの中で
open(FILE, "$arg");
とすることは可能ですか?
上の質問と組み合わせて全てのファイルを開いて作業を行いたいので。

説明が下手ですいません。補足しますのでよろしくお願いします。

Aベストアンサー

while(<*.data>)
{
## $_には、*.DATAなファイル名が格納されている。
open(F,"$_"); ##openする。
while(<F>)
{
##読み出された内容が$_に格納されている。
print $_; ##出力してみる。
}
}

というのが最短コーディングです。

Qディレクトリ名を取得したい

perlでディレクトリ名だけを取得したいのですが、
なかなかうまい方法が見つかりません。
ファイル名を取得する・・・というのは結構あるのですが、
ディレクトリ名だけ、というのがどうもわかりません。

ちなみにファイル名取得は以下のようにやっています。
my $md;
opendir(DIR, 'q');
while (defined($dir = readdir(DIR))) {
$md=substr($dir,0,6);
}
closedir(DIR);

ディレクトリ名だけを取得・・・というのはどうやればよいのでしょうか。

Aベストアンサー

ファイル名の取得で例示されているものは、ファイル名だけの取得できてませんよね?
質問者さんが書かれているスクリプトだと、
DIRの中にある「何か」の「たまたま」一番最後に入っていたものの「0文字目~6文字目」までを取得するスクリプトになっているのわかりますか?

my @file;
my @directory;
my $check_dir = "./q/";
$ct =0;
opendir(DIR,$check_dir);
while( defined($temp=readdir(DIR))){
#カレントディレクトリまたは上位ディレクトリの場合はパス
if( $temp eq '.' || $temp eq '..' ){ next;}
#ファイルの場合
if( -f $check_dir.$temp ){
push @file, $temp;
}
#ディレクトリの場合
if( -d $check_dir.$temp ){
push @directory, $temp;
}
}

$check_dirに設定されているディレクトリに格納されているファイルは@fileに、ディレクトリは@directoryに格納されます。

ファイル名の取得で例示されているものは、ファイル名だけの取得できてませんよね?
質問者さんが書かれているスクリプトだと、
DIRの中にある「何か」の「たまたま」一番最後に入っていたものの「0文字目~6文字目」までを取得するスクリプトになっているのわかりますか?

my @file;
my @directory;
my $check_dir = "./q/";
$ct =0;
opendir(DIR,$check_dir);
while( defined($temp=readdir(DIR))){
#カレントディレクトリまたは上位ディレクトリの場合はパス
if( $temp eq '.' || $temp eq '..' ){...続きを読む

Qひとつの命令を複数行に記述

検索してもあまり解説見かけないなぁと思うのですが、(どこが本家かわからないのでとりあえず放置)

VBでいう_に該当するものは何ですか?
ソースが長くなって見にくくなっているので、対処したいのですが。

hoge = "じゅげむじゅげむごごうのすりきれ" _ '←次の行に送る
& "かいじゃりすいぎょのうんらいまつふうらいまつすいぎょうまつ" 

Aベストアンサー

Perlは、VBと異なり行の概念がありません。
VBではステートメント区切り子が存在しないため、改行がステートメントの区切りとして扱われ、例外的につなげるときに「_」を使うわけですが、
Perlの場合はステートメント区切り子セミコロン「;」がステートメントの区切りになっていますので、セミコロンを打たない限り、何行に分かれてもひとつのステートメントとして扱われます。
したがって、回答としては「そのまま改行してOK」です。
上記の例なら、

$hoge = "じゅげむじゅげむごごうのすりきれ" .
"かいじゃりすいぎょのうんらいまつふうらいまつすいぎょうまつ";

という感じです。
当然ながら、文字列中での改行はダメなので、上記のようにいったん「"」を閉じて、文字列結合演算子「.」で接続することに成ります。

Qperlをコマンドラインで実行したい

今はperlをコマンドプロンプト上でファイルをコンパイルして実行結果を別のテキストファイルに出力しています。(printなど)

ただ、こまごまとした置換え・変換などいちいちテキストファイルにperlを書いてコンパイルして出力ファイルを開いて取り出すというやり方にわずらわしさを感じてきました。
簡単なスクリプトであれば、使い捨ての方がよく感じており、
コマンドプロンプトで試してみたのですが、長い文章やソースなどを変数にいれることができず、(改行がEnterにとられてしまう??)また、一行にずらずらとかかなくてはならないので、うまくいきません。

なにか、テキストエディタのような感じで、このようなperlスクリプトをコンパイルできるようなものはあるのでしょうか。

copalというものを使ってみたのですが、
ファイルハンドルなどが使えなかったのでだめでした。

どなたかご協力お願いします。

Aベストアンサー

copy con tmp_0001.pl
perl tmp_myperl_0001.pl %*
del tmp_myperl_0001.pl

メモ帳等で上の3行を書いて ~.bat という名前で保存。
このファイルはパスの通っているフォルダに置く。
仮にこのファイルの名前を myperl.bat としておく。
たとえば file1.txt と file2.txtを処理したかったらコマンドラインで
myperl file1.txt file2.txt
などと打つ。
するとperlスクリプトを入力できるようになるので、好きなだけ書いたら、最後に Ctrl+Z を打って入力終了。
即座にスクリプトが実行される。

前の行を修正したりとかはできないけど、簡単なことならこれで事足りるかと。

参考URL:http://support.microsoft.com/kb/68787/ja

QPerlの数値計算で有効桁数を上げたい

通常、Perlで数値計算をする場合、有効桁数は15~16桁になってしまいます。
これを、32桁、64桁と精度を上げて計算する方法はないでしょうか。
現在の環境は、Perl 5.8です。

よろしくお願いいたします。

Aベストアンサー

perl -MMath::BigFloat -e "print $Math::BigFloat::VERSION"
をコマンドラインから実行してみてそのバージョンが1.58(現時点での最新)
かどうかを確認し、最新であれば

>perl -MMath::BigFloat -e "print $Math::BigFloat::VERSION"
1.58
perl -MMath::BigFloat -e "my $x = Math::BigFloat->new(2); print $x->bsin(100);"
0.909297426825681695396019865911744842702254971447890268378973011530967301540783
5446201266889249593803

のように、Math::BigFloatクラスのメソッドが使えます。

最新のものでなければ、Windows 以外のOSなら cpan コマンドを、WindowsでActivePerlを使っているなら、
ppm コマンドを使って最新のものに更新してください。
このとき指定するのは Math::BigIntモジュールなのに注意してください。

>ppm-shell
ppm 4.01
Copyright (C) 2007 ActiveState Software Inc. All rights reserved.
ppm> search math-bigint
1: Math-BigInt v1.64
2: Math-BigInt v1.87
3: Math-BigInt v1.79
4: Math-BigInt-BitVect v1.11
5: Math-BigInt-Constant v1.04
6: Math-BigInt-FastCalc v0.15
7: Math-BigInt-FastCalc v0.10
8: Math-BigInt-GMP v1.24
9: Math-BigInt-GMP v1.19
10: Math-BigInt-Named v0.03
11: Math-BigInt-Pari v1.13
12: Math-BigInt-Random v0.03
13: Math-BigIntFast v6.0
ppm> install 2
Downloading Math-BigInt-1.87...done
Downloading Test-Simple-0.70...done
Unpacking Math-BigInt-1.87...done
Unpacking Test-Simple-0.70...done
Generating HTML for Math-BigInt-1.87...done
Generating HTML for Test-Simple-0.70...done
Updating files in site area...done
10 files installed
6 files updated
ppm> quit

perl -MMath::BigFloat -e "print $Math::BigFloat::VERSION"
をコマンドラインから実行してみてそのバージョンが1.58(現時点での最新)
かどうかを確認し、最新であれば

>perl -MMath::BigFloat -e "print $Math::BigFloat::VERSION"
1.58
perl -MMath::BigFloat -e "my $x = Math::BigFloat->new(2); print $x->bsin(100);"
0.909297426825681695396019865911744842702254971447890268378973011530967301540783
5446201266889249593803

のように、Math::BigFloatクラスのメソッドが使えます。

最...続きを読む


人気Q&Aランキング