LoginSignup
1
1

More than 5 years have passed since last update.

Perl : ソシャゲで使える曜日限定区分サンプル

Last updated at Posted at 2015-10-31

用途

  • 曜日限定のマスタデータを定義する場合に1レコードで管理できる
ID Caption Dow
1 火曜限定   2
2 土日曜限定   96

※Dow = DayOfWeek

ルール

0 1 2 4 8 16 32 64
指定なし 月曜 火曜 水曜 木曜 金曜 土曜 日曜
  • 土曜日を定義したい場合は 32 になる
  • 土曜と日曜日を定義したい場合は 96 (32+64)になる
  • 月曜と水曜と金曜日を定義したい場合は 21 (1+4+16)になる
  • ビット演算を利用して曜日の組み合わせを 0~127 の数値で定義することができる(但し0と127は同じ結果)

チェック処理

hoge1.pl
use strict;
use warnings;
use utf8;
use DateTime;
use constant {
    MON => 1,  TUES => 2, WED  => 4, THUR => 8,
    FRI => 16, SAT => 32, SUN => 64,
};

printf "MasterData(%d) is Saturday? %s\n",   1, !is_dayofweek(1)? "no":"yes";
printf "MasterData(%d) is Saturday? %s\n",  32, !is_dayofweek(32)? "no":"yes";
printf "MasterData(%d) is Saturday? %s\n",  34, !is_dayofweek(34)? "no":"yes";
printf "MasterData(%d) is Saturday? %s\n",  64, !is_dayofweek(64)? "no":"yes";
printf "MasterData(%d) is Saturday? %s\n", 127, !is_dayofweek(127)? "no":"yes";


# 0:対象日外、0以外:対象日
sub is_dayofweek {
    my ($dow) = @_;
    return 1 unless $dow; # 0の場合は全有効
    return $dow & (1 << DateTime->today->day_of_week_0);
}

1;

実行結果(土曜日に実行した場合)

$ perl hoge1.pl
MasterData(1) is Saturday? no
MasterData(32) is Saturday? yes
MasterData(34) is Saturday? yes
MasterData(64) is Saturday? no
MasterData(127) is Saturday? yes

1,0 でチェックしたい場合

# 0:対象日外、1:対象日
sub is_dayofweek {
    my ($dow) = @_;
    return 1 unless $dow; # 0の場合は全有効
    return ($dow & (1 << DateTime->today->day_of_week_0))? 1 : 0;
}

数値を曜日に変更するサンプル

hoge2.pl
use strict;
use warnings;
use utf8;
use DateTime;
use Encode;
use constant {
    MON => 1,  TUES => 2, WED  => 4, THUR => 8,
    FRI => 16, SAT => 32, SUN => 64,
};

for my $i (1..127) {
    printf "%3d : %s\n", $i, dayofweek_name($i);
}

sub dayofweek_name {
    my ($dow) = @_;
    return '' unless $dow;
    my @ret;
    push @ret, '' if ( $dow & MON  );
    push @ret, '' if ( $dow & TUES );
    push @ret, '' if ( $dow & WED  );
    push @ret, '' if ( $dow & THUR );
    push @ret, '' if ( $dow & FRI  );
    push @ret, '' if ( $dow & SAT  );
    push @ret, '' if ( $dow & SUN  );
    return encode('utf-8',(join ',', @ret));
}

1;

実行結果

$ perl hoge2.pl
  1 : 月
  2 : 火
  3 : 月,火
  4 : 水
  5 : 月,水
   ...
124 : 水,木,金,土,日
125 : 月,水,木,金,土,日
126 : 火,水,木,金,土,日
127 : 月,火,水,木,金,土,日
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1