CGI/Perl - Tips

■通貨のカンマ区切り

CGI/Perlで数値を通貨のカンマ区切り(3桁)にします。

s/(\d{1,3})(?=(?:\d\d\d)+(?!\d))/$1,/g;

例えば「1580」をカンマ区切りにすると、「1,580」になります。

$price = 1580;
$price =~ s/(\d{1,3})(?=(?:\d\d\d)+(?!\d))/$1,/g;

■パスワード生成

用意した文字列の中より無作為に文字をとりだし、8桁のパスワードを生成します。

$chars = "0123456789!#$%&=@+-*abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
$len = length( $chars );
$password = "";

srand;
for( $i = 0; $i < 8; $i++ ){
$password .= substr( $chars, int( rand( $len )), 1 );
}

print "pw : $password";

パスワードの桁数は、for文の 8 を変更することで任意の桁数へ変更できます。

生成されるパスワードの文字列は、$charsで指定した文字列の中から取り出されます。この文字列を変更することでパスワードに使用可能な文字種類に変更できます。

また、指定する文字列の順番を変更することで、生成されるパスワードも変わってきます。


■ファイルのダウンロード

CGIプログラムからファイルをダウンロードするように出来ます。

htmlでファイルのパスを<a href="***">で指定してもよいのですが、ファイル名だけじゃなくてパスも見えてしまうために、CGIプログラムからダウンロードファイルを指定出来るようにしてみました。

● CGI(Perl)側

$filedir = './';
$filename = 'sample.zip';
$filepath = $filedir . $filename;

print "Content-type:application/octet-stream; name=\"$filename\"\n";
print "Content-Disposition: attachment; filename=\"$filename\"\n\n";
open(IN,"$filepath");
print <IN>;
close( IN );

上記例では、sample.zip ファイルをダウンロードします。

使用方法は、ブラウザに直接CGIプログラム名を指定するか、htmlから<a>リンクで呼び出します。

● htmlからの呼び出し例 (dl.cgiとした場合)

<a href="dl.cgi">sample.zip</a>

ダウンロードファイルが1つなら、CGIプログラムに直接ダウンロードファイル名を書き込んでもよいのですが、ダウンロードファイル名をパラメータにしてCGIプログラムに渡すようにしたほうがよいでしょうね。

ただし、この方法だと何でもかんでもダウンロードできてしまう危険性があるので、ファイル名、パス名等の指定方法に注意が必要です。

また、ブラウザによってはうまくダウンロードが実行されないかもしれません。
因みに、使用したブラウザは IE6 SP2 です。


■うるう年をチェック

うるう年の計算を行います。

うるう年の計算式は、
 − 4 で割り切れる年はうるう年。
 − 但し、100 で割り切れる年はうるう年ではないが、
 − 400 で割り切れる年はうるう年。

これをベタにプログラミング、関数化してみました。

● うるう年チェック関数

#---------------------------------------
# うるう年チェック
#---------------------------------------
sub CheckLeapYear {
  local( $year ) = @_;

  if(( $year % 4 ) == 0 ) {
    if(( $year % 100 ) == 0 ) {
      if(( $year % 400 ) == 0 ) {
        $res = 1;
      } else {
        $res = 0;
      }
    } else {
      $res = 1;
    }
  } else {
    $res = 0;
  }

  return $res;
}

CheckLeapYear関数に調べたい年を渡すと、うるう年なら 1 を、うるう年ではなければ 0 を返します。

● 呼び出し例

$nen = 1000;
print "$nen年は、";
if( &CheckLeapYear( $nen )) {
  print "うるう年です";
} else {
  print "うるう年ではありません";
}

この例では、1000年を調べていますので、1000年はうるう年ではないので、

  「1000年は、うるう年ではありません」

と表示されます。


■うるう年をチェック(改)

うるう年の計算プログラム(関数)をちょっと改良してシンプルにしてみました。

● うるう年チェック関数(改良版)

#---------------------------------------
# うるう年チェック
#---------------------------------------
sub CheckLeapYear {
  local( $year ) = @_;

  $res = 0;

  if(( $year % 4 ) == 0 ) {
    if(( $year % 100 ) != 0 || ( $year % 400 ) == 0 ) {
      $res = 1;
    }
  }

  return $res;
}