Perlのサンプルプログラム集です。
実際に使っているPerlスクリプトですが、プログラムソースとして公開するには、汎用性に欠けるものを集めてあります。
用途が限定されていますので、パラメータの指定は、スクリプトの先頭で変数に代入して使うものもあります。
このようなサンプルを流用すると、必要なスクリプトは、1日から2日で作成することができます。
ASHのホームページで公開しているスクリプトの著作権はASHにあります。
スクリプトの利用や改造は、非商用、商用にかかわらず自由です。
ただし、利用される場合は、ASHへのリンク、ASHに対するカンパ、ASHに対する仕事の依頼などをお願いします。
ASHではスクリプトの作成も行っています。
日次処理のテストのために、そのパラメータ用に、連続した日付を生成するスクリプトです。
評価用のログデータの自動生成などにも使えます。
スクリプトの先頭の変数に開始年月と終了年月を設定することで、連続した年月日を自動生成します。
このスクリプトは、1991年から、2099年までの範囲で使えます。
出力書式などを変更したい場合は、スクリプトを修正してください。
| gen_date.pl |
|---|
#!/usr/local/bin/perl
#
# Date Generator
#
# 開始年月の設定
$yy_s = 1999; # start year(1997-2003)
$mm_s = 04; # start month(01-12)
$dd_s = 01; # start day(01-31)
# 終了年月の設定
$yy_e = 2005; # end year(1997-2003)
$mm_e = 03; # end month(01-12)
$dd_e = 31; # end day(01-31)
&gen_date($yy_s,$mm_s,$dd_s,$yy_e,$mm_e,$dd_e);
# 日付の連続生成
sub gen_date {
my($yy_s,$mm_s,$dd_s,$yy_e,$mm_e,$dd_e) = @_;
$yy = $yy_s; # year(1997-2003)
$mm = $mm_s; # month(01-12)
$dd = $dd_s; # day(01-31)
while (1) {
# 年月日表示
printf ("%04d%02d%02d\n", $yy, $mm, $dd);
# 終了日判断
if ($yy >= $yy_e) {
if ($mm >= $mm_e) {
if ($dd >= $dd_e) {
last;
}
}
}
# 翌日計算
$dd++;
if ($mm == 2) {
if ($dd > 28) {
if ($dd > 29) {
$mm++;
$dd = 1;
} else {
if ($yy % 4) { # うるう年以外
$mm++;
$dd = 1;
}
}
}
} elsif (($mm == 4) || ($mm == 6) || ($mm == 9) || ($mm == 11)) {
if ($dd > 30) {
$mm++;
$dd = 1;
}
} else {
if ($dd > 31) {
$mm++;
$dd = 1;
}
if ($mm > 12) {
$yy++;
$mm = 1;
}
}
}
}
|
Cでプログラミングする場合は、メイクファイルを使ってメイクします。
メイクファイルでは、ソースとオブジェクトの関連を定義することで、変更のあったプログラムだけがコンパイルされます。
しかし、ヘッダファイルをインクルードしている場合は、ヘッダとオブジェクトの関連を定義しなければならないのと、ヘッダのコメントを修正しても、関連するプログラムがコンパイルされたりしてしまいます。
そこで、ヘッダとオブジェクトの関連は定義せずに、メイクファイルは推論規則により、自動メイクするようにします。
これにより、メイクファイルの保守や、無駄なコンパイルを減らすことが出来ます。
ただし、ヘッダを変更してもコンパイルされないため、ヘッダ名を指定すると、そのヘッダを利用しているソースのオブジェクトを削除するスクリプトを利用します。
このスクリプトを利用する場合は、ディレクトリ配下に、src,inc,objというディレクトリが存在する必要があります。
| del_obj.pl |
|---|
#!/usr/local/bin/perl
#
# 関連オブジェクトファイル削除コマンド
# src配下の*.c,*.pcのファイルを検索
# include文で指定したヘッダを利用しているファイルを抽出
# obj配下の関連するオブジェクトファイルを削除
#
# ディレクトリ構成
# $base_dir
# ├src/ ソース格納用
# ├inc/ ヘッダ格納用
# └obj/ オブジェクト格納用
#
&init(); # 初期設定
&main(); # メイン処理
exit(0);
# 使用方法の表示
sub usage {
printf("Usage: %s [-d base_dir] inc_files\n", $prog_name);
exit(-1);
}
# 初期設定
sub init {
$base_dir = '.'; # デフォルトベースディレクトリ
$src_dir = 'src'; # デフォルトソースディレクトリ
$obj_dir = 'obj'; # デフォルトオブジェクトディレクトリ
}
# コマンドオプションの取得
sub get_opt {
# デフォルトパラメータの設定
$prog_name = $0;
# オプションの解析
while ($#ARGV >= 0) {
if ($ARGV[0] eq "-x") { # デバッグモード
$dbg = 1;
} elsif ($ARGV[0] eq "-d") { # ベースディレクトリの変更
shift(@ARGV);
$base_dir = $ARGV[0];
} elsif ($ARGV[0] =~ /^-/) { # 使用方法の表示
&usage();
} else {
last;
}
shift(@ARGV);
}
@incs = @ARGV; # ヘッダ名の指定(複数可)
if (@incs == 0) {&usage();}
}
# メイン処理
sub main {
my (@files, $file);
my ($buf, $inc, $obj);
&get_opt(); # コマンドオプションの取得
# ディレクトリの初期設定
$src_dir = "$base_dir/$src_dir";
$obj_dir = "$base_dir/$obj_dir";
# 設定値の表示
if ($dbg) {
print "base_dir = $base_dir\n";
print "src_dir = $src_dir\n";
print "obj_dir = $obj_dir\n";
print "incs = @incs\n\n";
}
# ファイル一覧の取得
if (!opendir(DIR, $src_dir)) {
printf("Directory %s open error.\n",$src_dir);
exit(1);
}
@files = readdir(DIR);
closedir(DIR);
# ファイル処理
L_FILE: foreach $file (@files) {
if ($file !~ /(.*)(\.pc|\.c)$/) {next;}
$base = $1;
$path = "$src_dir/$file";
if ($dbg) {print "path = $path\n";}
$file_open = "<$path";
if (!open(FILE_IN, $file_open)) {
printf("File %s open error.\n",$path);
exit(1);
}
# レコード処理
L_REC: while(<FILE_IN>) {
chomp($buf = $_);
# include文以外は次の行へ
if ($buf !~ /^#include/) {next;}
if ($dbg) {print "buf = $buf\n";}
# ヘッダチェック処理
L_INC: foreach $inc (@incs) {
if ($buf =~ /$inc/) { # 対象となるヘッダを利用
$obj = "$obj_dir/$base.o";
# 関連オブジェクトファイルの削除
print "rm -f $obj\n";
system("/bin/rm -f $obj");
next L_FILE;
}
}
}
close(FILE_IN);
}
}
|