期間内の日付が、年初から第何週にあたるのか、また何曜日にあたるのか簡単に調べる

以下の記録を組み合わせただけ。

#!/bin/env perl
use strict;
use warnings;
use Date::Calc qw(Day_of_Week Week_Number Day_of_Year);
use Date::Simple;

my($start, $end) = @ARGV;

my $start_day = Date::Simple->new($start);

# 片端入れで動作するために、1日プラスしている。
my $term = Date::Simple::date($end) - Date::Simple::date($start) + 1;

for (my $i = 0; $i < $term; $i++) {
    my $target_day = $start_day + $i;

    my $year  = $target_day->year;
    my $month = $target_day->month;
    my $day   = $target_day->day;

    print $target_day, "\t", Week_Number($year, $month, $day), "\t", Day_of_Week($year, $month, $day), "\n";
}

それを実行してみる。

% ./number_of_week.pl 2009-11-01 2009-11-30
2009-11-01      44      7
2009-11-02      45      1
2009-11-03      45      2
2009-11-04      45      3
2009-11-05      45      4
2009-11-06      45      5
2009-11-07      45      6
2009-11-08      45      7
2009-11-09      46      1
2009-11-10      46      2
2009-11-11      46      3
2009-11-12      46      4
2009-11-13      46      5
2009-11-14      46      6
2009-11-15      46      7
2009-11-16      47      1
2009-11-17      47      2
2009-11-18      47      3
2009-11-19      47      4
2009-11-20      47      5
2009-11-21      47      6
2009-11-22      47      7
2009-11-23      48      1
2009-11-24      48      2
2009-11-25      48      3
2009-11-26      48      4
2009-11-27      48      5
2009-11-28      48      6
2009-11-29      48      7
2009-11-30      49      1

注意点

  1. 月曜日を週の初めとして数えているため、月曜日が「1」になり、日曜日が「7」になる。
    (日本では日曜日が一般的なので、注意)
  2. 週の数え上げは「0」から始まる。

参考

% ./number_of_week.pl 2009-12-30 2010-01-02
2009-12-30      53      3
2009-12-31      53      4
2010-01-01      0       5
2010-01-02      0       6

% ./number_of_week.pl 2010-01-01 2010-01-02
2010-01-01      0       5
2010-01-02      0       6

Windows版 Perl で挿入した改行が \r\n になってしまう

#!/bin/env perl
open my $out, '>', 'test.txt'; 
# 改行が \n ではなく、\r\n になってしまう
print $out 'Windows 版の Perl だと改行が \\r\\n になってしまう', "\n";
close $out;

binmode でファイルポインタを指定すれば解決する

標準入出力やオープンしたファイルは通常テキストモードになっています。この状態でバイナリファイルを読み書きすると、0a と 0d 0a の自動変換が働いてしまい、データが壊れてしまいます
Windows でバイナリファイルを読み込む際には、binmode() を用いて、指定したファイルハンドルをバイナリモードに設定する必要があります。UNIX では binmode() を呼び出しても何の変化もありません。

http://www.tohoho-web.com/perl/binary.htm

というのが原因となる。

#!/bin/env perl
open my $out, '>', 'test.txt'; 
# バイナリモードで動作するように設定
binmode($out);
print $out 'binmode を使うと、改行が \\n になる', "\n";
close $out;