goo blog サービス終了のお知らせ 

DEVELOPMENTOR*LEARNING RESOURCE LAB.

ソフトウェア開発現場の視点からソフトウェアと開発者の価値を高める「ホットな何か」をお届けします。(休止)

do {} while/until での last は私の期待と違う振る舞いをする?

2007年05月16日 | perl
Perl スクリプトを書いているとき do {} while/until の last が私の期待どおり振舞ってくれないので、ちょっと焦り&悩んでしまいました。

例えば、次のように for ループの中の do {} while で last を使うと、for ループを抜けてしまいます。このとき、私は do {} while を抜けるとばかり思い込んでいました。

気になって『初めてのPerl』で確認したところ do {} while/until はループでなくブロック扱いなので last の対象にならないとのこと。知らなかった。

for (...) {
  do {
    last if (...); # for ループを抜けてしまう?
  } while (...);
}


初めてのPerl
ランダル・L. シュワルツ トム フェニックス Randal L. Schwartz

4873111269

関連商品
プログラミングPerl〈VOLUME1〉
続・初めてのPerl 改訂版
CGIプログラミング
Perl/CGI逆引き大全 600の極意
詳説 正規表現 第2版
by G-Tools


Jcode.pmを使って文字列を「\uXXXX」形式に変換する

2007年01月15日 | perl

Introducing JSON」の中で、JSONのstringは「uXXXX 4 hexadecimal digits」と表現できるとあります。この表現はJavaScript::UCSエンコードと呼んだりするようです。

このエンコードの意味を理解するため、Jcode.pmを使って、指定した文字列を「uXXXX」形式に変換するPerlスクリプトを書いてみました。↓こんな感じです。


View example

このPerlスクリプトは、Perl 5.6以前を対象としています。Perl 5.8以降ならEncode.pmを使って、より手軽に実現できるハズです。

  1. 指定した文字列の文字コードをEUC-JPからUCS2に変換します。
  2. unpack関数を使ってUCS2文字列を16bit(short)単位に分割します。
  3. 16bit(short)から「uXXXX」形式の文字列を作ります。これを分割した分だけ繰り返しします。
  4. 最後に「uXXXX」形式の文字列をすべて結合します。
#!/usr/bin/perl
use strict;
use CGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser);

##
&main;
exit;

##
sub main {
  my $q = param('q');
  my $r = param('q');
  $r = &kanjicode($r, 'ucs2', 'euc');
  my @r = unpack('n*', $r);
  @r = map { sprintf("\u%04X", $_); } @r;
  $r = join('', @r);

  print CGI::header(
    -type => 'text/html', -charset => 'EUC-JP'
  );
  print &load_template('jsucs',
    q => $q, r => $r
  );
}

##
sub load_template {
  my ($name, %param) = @_;
use HTML::Template;
  my $template = new HTML::Template(
    filename => "./$name.tmpl", die_on_bad_params => 0
  );
  $template->param(
    %param,
  );
  return $template->output;
}

##
sub kanjicode {
  my ($textref, $kanjicode, $ikanjicode) = @_;
use Jcode;
  &Jcode::convert($textref, $kanjicode, $ikanjicode);
  return $$textref;
}

"True Value";

win32版apacheの.htpasswdを編集する(その2)

2006年10月07日 | perl

UNIXで動作する.htpasswdを編集するperlスクリプト(CGIプログラム)をWindowsで動作するように改造するときは Crypt-PasswdMD5-1.3 というperlモジュールを使うと簡単です。

はじめにCrypt-PasswdMD5-1.3をインストールします。 perlモジュールのインストール方法がわからないときは、前述のアドレスから Crypt-PasswdMD5-1.3.tar.gzというファイルをダウンロードします。

Crypt-PasswdMD5-1.3.tar.gzを解凍すると次のようなディレクトリとファイルが作成されます。この中からPasswdMD5.pmというファイルを perlスクリプトのカレントディレクトリかライブラリを格納するディレクトリにコピーします。このときCryptというディレクトリを作成し、ファイル名はCrypt/PasswdMD5.pmとします。

Crypt-PasswdMD5-1.3/
  README
  PasswdMD5.pm
  META.yml
  MANIFEST
  Makefile.PL
Crypt-PasswdMD5-1.3/t/
  basic.t

.htpasswdを編集するperlスクリプト(CGIプログラム)の中に、次のようにcrypt関数を使用してパスワードを認証している部分があると思います。このcrypt関数をapache_md5_crypt関数に置き換えます。引数は同じままで大丈夫です。

  #my $ok = crypt($password, $crypted);
  use Crypt::PasswdMD5;
  my $ok = apache_md5_crypt($password, $crypted);

同じようにcrypt関数を使用してパスワードを暗号化している部分があると思います。このcrypt関数をapache_md5_crypt関数に置き換えます。引数は同じままで大丈夫です。

  #my $crypted = crypt($password, $salt);
  use Crypt::PasswdMD5;
  my $crypted = apache_md5_crypt($password, $salt);

perlスクリプト(CGIプログラム)の改造はこの2点です。これでUNIX版のapacheで動作したものが、Windows版のapacheでも動作するようになります。

ただし、依然としてUNIXとWindowsで暗号化の方式が異なりますので、 UNIXで編集した.htpasswdファイルをWindowsで使うことや、 Windowsで編集した.htpasswdファイルをUNIXで使うことはできません。そのためUNIXとWindowsとの間で.htpasswdファイルを使い回すときは別の方法が必要となるでしょう。


win32版apacheの.htpasswdを編集する(その1)

2006年10月07日 | perl

apacheの基本認証は特定のユーザのみにWEBサイトへのアクセスを許可するために利用する機能です。 apacheの基本認証は.htpasswdというファイルにユーザとパスワードを保存します。

この.htaccessファイルを編集できる様々なperlスクリプト(CGIプログラム)が公開されていますが、 UNIX版のapacheで動作したものが、Windows版のapacheでは動作しないことがあります。これはUNIXとWindowsで暗号化の方式が異なることが主な原因です。

次のようにUNIX版のhtpasswdコマンドと使って.htpasswdファイルを作成します。今回はfreebsd 4.xとapache 1.3.xを使用しました。

% htpasswd -c .htpasswd user
New password:
Re-type new password:
Adding password for user user
% cat .htpasswd
user:IUbf3xXD3kJVI

次のようにWindows版のhtpasswdコマンドと使って.htpasswdファイルを作成します。今回はWindows XPとapache 1.3.xを使用しました。

C:PROGRA~1APACHE~1APACHEBIN>htpasswd -n user
Automatically using MD5 format on Windows.
New password: ****
Re-type new password: ****
user:$apr1$Yd5.....$rRok8y/LV0XuIFVYoEBGu0

UNIXとWindowsでは作成した.htpasswdファイルに違いがあります。 UNIXよりもWindowsの方が暗号化したパスワードの文字列が長くなります。 UNIXはDES形式、WindowsはMD5形式という異なる暗号化を利用するためです。

それでは.htaccessファイルを編集するperlスクリプト(CGIプログラム)を Windowsで動作させるにはどうすればよいでしょうか。次回は Crypt-PasswdMD5-1.3 というperlモジュールを使って簡単にperlスクリプトを改造する方法をご紹介します。