Digest::MD5(Perlでmd5を利用する)

PHPには、md5()という標準関数が用意され、簡単にハッシュを作成することが出来ます。
例えば、「12345」という文字列のハッシュは「827ccb0eea8a706c4c34a16891f84e7b」となります。
しかし、Perlにはハッシュを作成できる標準関数はありません。
使用したDigest::MD5モジュールのバージョンは2.36でした。
Perlのバージョンが5.8であれば、インストールされています。

使い方

use Digest::MD5 qw/md5_hex/;
print md5_hex( 12345 );
my $md5 = md5_hex( 12345 );
print $md5;

PHPの場合

PHPには標準関数が用意されています。

$md5 = md5( 12345 );
echo $md5;

関連サイト

Image::Magick::Thumbnail::Simple 0.12 原文

「翻訳」ではなく「原文」なのは、私が作ったモジュールだからです。
Image::Magick::Thumbnail::Simpleモジュールのバージョンは0.12です。

目次

名前

Image::Magick::Thumbnail::Simpleサムネイル画像を無駄なく簡単に作ります

構文

ファイルに出力

use Image::Magick::Thumbnail::Simple;
my $t = new Image::Magick::Thumbnail::Simple;
$t -> thumbnail(
  input  => 'input.jpg',
  output => 'output.jpg',
  size   => 128,
) or die $t -> error;

標準出力に出力

use Image::Magick::Thumbnail::Simple;
my $t = new Image::Magick::Thumbnail::Simple;
binmode STDOUT;
print "Content-type: image/jpegnn";
$t -> thumbnail(
  input  => 'input.jpg',
  output => 'jpg:-',
  size   => 128,
) or die $t -> error;

初期化のときに指定する場合

別に指定しないかぎり、以降全てに継承されます。


$t = new Image::Magick::Thumbnail::Simple(
  size    => 128,
  blur    => 0.8,
  quality => 80,
);

変更する場合

$t -> size( 128 );
$t -> blur( 0.8 );
$t -> quality( 80 );

個別に指定する場合

入力と出力は、個別にしか指定できません。


$t -> thumbnail(
  input   => 'input,jpg',
  output  => 'output.jpg',
  size    => 128,
  blur    => 0.8,
  quality => 80,
);

サムネイル画像の横幅

$width = $t -> width;

サムネイル画像の縦幅

$height = $t -> height;

説明

Image::Magickを使って、簡単にサムネイル画像を作成できます。
基本的な設定はImage::Magickと同じです。画像のリサイズの処理のみを扱います。
公開したバージョンは0.10です。
0.12では、説明の修正と、サムネイルのサイズを返すようになりました。

参照

Image::Magick

作者

Satoshi Ishikawa <cpan@penlabo.net>

Copyright (C) 2008 Satoshi Ishikawa

このライブラリはフリーソフトウェアです。
Perl自体と同じ条件で再配付、または変更することができます。
利用可能なPerlのバージョンは5.8.8、またはこれ以降のバージョンです。

更新履歴

2008-04-03
公開

XML::Simple(PerlでXMLをパースする)

Ajaxへの熱が冷めはじめた昨今、しかしXMLファイルを扱う機会はあまり減りません。
使用したXML::Simpleモジュールのバージョンは2.18でした。
Perlのバージョンが5.8であれば、インストールされています。

使い方

my $xml = <<'XML';
<?xml version="1.0" encoding="UTF-8"?>
<urlset>
  <url>http://127.0.0.1/</url>
  <title>localhost</title>
  <copyright>Administrator</copyright>
</urlset>
XML
use XML::Simple;
my $xs = new XML::Simple();
my $parser = $xs -> XMLin( $xml );
my %parse = (
  'uri'       => $parser -> {'uri'},
  'title'     => $parser -> {'title'},
  'copyright' => $parser -> {'copyright'},
);
use utf8;
foreach my $key ( keys %parse ){
  utf8::encode( $parse{$key} );
  printf( "%s : %s\n", $key, $parse{$key} );
}

不具合

エンコードが正しく指定されていても、UTF-8以外であれば受け付けてくれません。

おわりに

結果の文字列にBOMを付けるという余計な事をするため、
utf8::encodeでBOMを除去する処理が必要になってしまいます。
スイッチをつけるなどして、選べるようにしてほしい。

更新履歴

2008-04-04
サイト移動に伴うHTMLの修正(旧URI:[廃止])
2008-01-07
公開

LWP::Simple(PerlでWeb上のリソースを取得する)

お手軽に、Web上のリソースを取得しましょう。
使用したLWP::Simpleモジュールのバージョンは1.41でした。
Perlのバージョンが5.8であれば、インストールされています。

使い方

use LWP::Simple;
my $html = get( 'http://127.0.0.1/' );
print $html;

不具合

HTTPレスポンスコードが200以外の場合、プロセスが死ぬので注意。

PHPの場合

とってもお手軽な標準関数が用意されています。

$html = file_get_contents( 'http://127.0.0.1/' );
echo $html;

おわりに

レスポンスコードを返してくれても良いような気がします。

更新履歴

2008-04-04
サイト移動に伴うHTMLの修正(旧URI:[廃止])
2008-01-07
公開

HTML::HeadParser(PerlでHTMLヘッダをパースする)

Webサイトのmetaタグを解析する必要が増えてきました。
いままでは、パターンマッチで一つずつ取り出していました。
モジュールが用意されているので、使ってみましょう。
使用したHTML::HeadParserモジュールのバージョンは2.22でした。
Perlのバージョンが5.8であれば、インストールされています。

使い方

use LWP::Simple;
my $html = get( 'http://127.0.0.1/' );
use HTML::HeadParser;
my $p = new HTML::HeadParser;
$p -> parse( $html );
my %parse = (
  'title'       => $p -> header( 'title'              ),
  'charset'     => $p -> header( 'content-type'       ),
  'copyright'   => $p -> header( 'x-meta-copyright'   ),
  'keywords'    => $p -> header( 'x-meta-keywords'    ),
  'description' => $p -> header( 'x-meta-description' ),
);
foreach my $key ( keys %parse ){
  printf( "%s : %s\n", $key, $parse{$key} );
}

不具合

XHTMLのソースを渡すとエラーでプロセスが落ちてしまうので、
HEADタグの中身のみを渡した方がいいでしょう。

おわりに

x-metaという使い方には、いまだに慣れません。
XHTMLに対応して、URIを直接指定したいですね。

更新履歴

2008-04-04
サイト移動に伴うHTMLの修正(旧URI:[廃止])

2008-01-07
公開

HTML/AA 0.01

HTML/AAPHPのモジュールです。
スクリプトと同じ階層か、PHPのモジュール用のパスに設置してください。
AAはアスキーアート(Ascii Art)と同じ要領で、アスキーアジャスト(Ascii Adjust)を行います。
このモジュールは、ブラウザに表示する文字列を整形する機能を有します。
このモジュールは、PerlのHTML::AAモジュールの移植版です。
UTF-8への対応も予定しておりますので、しばらくお待ちください。
ご意見、ご感想は、モジュール内に記載されているメールアドレスまでお寄せください。
PEARへの登録方法がよく分かりません。誰か教えて・・・

注意

エンコードはEUC-JP、Shift_JISに対応しています。
解説は、このページが一番詳しく、判りやすいと思います。
文字コードが異なる場合には、正常な結果を得ることができません。
MS Pゴシック12ポイントで表示した場合に限り、正常に表示できると予想されます。
文字列の先頭に半角スペースが出力された場合、それが行頭になるとずれる現象が発生します。
詳しくは、アスキーアートを紹介しているサイト等を参考にしてください。
文字列内に半角スペースの連続が混入していないと仮定します。

構文

HTML/AAモジュールを使う準備

require_once( 'HTML/AA.php' );
$aart = new AA( );
printf( '%s Version %s', $aart -> module, $aart -> version );
PHP HTML/AA module Version 0.01

文字列の長さを求める

echo $aart -> calcu_euc( '文字列の長さを求める' );
152

文字列を文字1つの配列に分解する

echo join( '|', $aart -> divide_euc( '文字列を文字1つの配列に分解する' ) );
文|字|列|を|文|字|1|つ|の|配|列|に|分|解|す|る

調整ドットを挿入して指定したサイズに整形

// 調整ドットは左側
echo $aart -> adjust_left_euc( '左側の文字', '右側の文字', 256 );
// 調整ドットは右側
echo $aart -> adjust_right_euc( '左側の文字', '右側の文字', 256 );
左側の文字.         右側の文字
左側の文字         .右側の文字

配列を1行と見立てて、整形できる最小のサイズを求める

$ary = array( '配列の中から', '整形可能な最小のサイズを', '返します' );
echo $aart -> shorter_euc( $ary );
226

配列を1行と見立てて、指定された倍数で、整形できる最小のサイズと、何倍かを求める

$ary = array( '配列を1行と見立てて', '指定された倍数で', '整形できる最小のサイズと', '何倍かを求める' );
echo join( ':', $aart -> shorter_multiple_euc( 16, $ary, $ary ) );
400:25

サンプルスクリプト

サンプルスクリプトのEUC-JPとShift_JISはダウンロード用パッケージに同梱されています。

<html>
<head>
<style type="text/css">
<!--
  table,tr,th,td { border:1px gray solid; border-collapse:collapse; text-align:center; }
  input,textarea { margin:4px; }
  input { text-align:center; }
//-->
</style>
</head>
<body>
<?php
require_once( 'HTML/AA.php' );
$aart = new AA( );
printf( '<h1>%s Version %s</h1>', $aart -> module, $aart -> version );
?>
<h3>EUC-JPサンプル</h3>
<ul>
  <li><a href="http://penlabo.net/PHP/HTML-AA.html">HTML/AA(ぺんラボ)</a></li>
  <li><a href="HTML-AA_euc.php">EUC-JP</a></li>
  <li><a href="HTML-AA_sjis.php">Shift_JIS</a></li>
</ul>
<form action="" method="post">
<table>
<tr>
  <td>左側</td>
  <td><input type="submit" value="整形"></td>
  <td>右側</td>
</tr>
<tr>
  <td>
    <textarea name="multilineL" cols="50" rows="10" style="font-size:85%">FightAIDS@Home
Human Proteome
Discovering Dengue Drugs - Together
Rosetta@home
SIMAP
TANPAKU
proteins@home
SETI@Home
Folding@Home
CHRONOS</textarea>
  </td>
  <td>
    <input type="text" name="separate" value="│" size="2">
  </td>
  <td>
    <textarea name="multilineR" cols="50" rows="10" style="font-size:85%">HIVの新薬開発
たんぱく質構造の予測
デング熱治療薬開発プロジェクト
たんぱく質構造の予測
たんぱく質の類似性データベースの構築
たんぱく質構造の予測
たんぱく質構造の予測
地球外の知的生命を検出
たんぱく質構造の予測・アルツハイマー解析
ヒトゲノム染色体間法則性解明</textarea>
  </td>
</tr>
</table>
</form>
<div style="font-family:MS Pゴシック;font-size:12pt">
<?php
if( isset( $_POST['multilineL'] ) && isset( $_POST['multilineR'] ) ){
  aa( $aart );
}
function aa( &$aart ){
  // mb_splitにもスイッチつけれ
  mb_regex_encoding( 'EUC-JP' );
  // 改行コード除去
  $aryL = mb_split( '\x0d\x0a|\x0d|\x0a', $_POST['multilineL'] );
  $aryR = mb_split( '\x0d\x0a|\x0d|\x0a', $_POST['multilineR'] );
  // 配列の小さいほうを基準に
  $max = count( $aryL ) < count( $aryR ) ? count( $aryL ) : count( $aryR );
  $aryL = array_splice( $aryL, 0, $max );
  $aryR = array_splice( $aryR, 0, $max );
  // 最短整列ドット数
  $minL = $aart -> shorter_euc( $aryL );
  $minR = $aart -> shorter_euc( $aryR );
  // 整形
  for( $i = 0; $i < $max; $i ++ ){
    echo $_POST['separate'];
    echo $aart -> adjust_right_euc( '', $aryL[$i], $minL );
    echo $_POST['separate'];
    echo $aart -> adjust_left_euc( $aryR[$i], '', $minR );
    echo $_POST['separate'];
    echo "<br>\r\n";
  }
}
?>
</div>
</body>
</html>
│            .FightAIDS@Home│HIVの新薬開発.                  │
│             .Human Proteome│たんぱく質構造の予測              │
│Discovering Dengue Drugs - Together│デング熱治療薬開発プロジェクト        │
│              .Rosetta@home│たんぱく質構造の予測              │
│                    .SIMAP│たんぱく質の類似性データベースの構築.   │
│                  . TANPAKU│たんぱく質構造の予測              │
│               .proteins@home│たんぱく質構造の予測              │
│                SETI@Home│地球外の知的生命を検出             │
│               .Folding@Home│たんぱく質構造の予測・アルツハイマー解析│
│                 .CHRONOS│ヒトゲノム染色体間法則性解明.        │

動作サンプル

EUC-JPサンプル
Shift_JISサンプル

補足

各バージョンごとに使い方が変わると思います。ご注意ください。
使い勝手がいいとはいえません。ぼちぼち更新していくかもしれませんが、関数名が変更になる可能性があります。
下のように、バージョンチェックをしたほうがいいかもしれません。

if( $aart -> version != 0.01 ){ echo 'The version of the HTML/AA module is different.'; }

ダウンロード

HTML_AA-0.01.zip

履歴

2008-04-07
サイト移動に伴うHTMLの修正(旧URI:[廃止])
2007-09-16
Perlから移植 バージョン0.01

RSS(RubyでRSSをパースする)

説明
RSSファイルを参照し、オリジナルのリーダーを作成する。

RSSの解説は、下のサイトを参考にしました。
RSSによるサイトの情報の要約と公開
RSSモジュールの解説は、下のサイトを参考にしました。
RubyRSS
RSS Parser
確認環境
OS:Windows2000、WindowsVista
Ruby:ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
必要なパッケージ:RSSモジュール(インストールが必要です)
注意
RSSモジュールは、標準でインストールされていません。
Windowsでパッケージを追加するには、上にあるリンクからRSSモジュールのパッケージファイルをダウンロードしてください。
インストール方法は、パッケージを解凍して、その中にある「setup.rb」を実行、つまり「ruby setup.rb」でインストールできます。
リファレンスどおりにコーディングしても、RSSのバージョンによっては正常にパースできないことがあるようです。
動作確認を行ったモジュールのバージョンは0.1.7です。ファイル名でバージョンがわかるようにしてください…。
サンプル
http://pear.php.net/のRSS
ソース
#!/ruby/bin/ruby

require 'rss'

# RSSファイルのURL
url = "http://raa.ruby-lang.org/index.rdf"
content = ""

open( url ) do |s|
	content = s.read
end

# RSSのパース
begin
	rss = RSS::Parser.parse( content )
rescue RSS::InvalidRSSError
	rss = RSS::Parser.parse( content, false )
end

# HTMLの出力開始
print "Content-type: text/html\n\n"

# channnelタグ出力
channel = rss.channel
printf("<html>\n<head>\n\t<title>RSS - %s</title>\n</head>\n<body>\n",
	channel.title
)

printf( "<h3><a href=\"%s\">%s</a></h3>\n<p>%s</p>\n",
	channel.link,
	channel.title,
	channel.description
)

# imageタグ出力
if rss.image != nil then
	image = rss.image
	printf( "<p><a href=\"%s\"><img src=\"%s\" alt=\"%s\" align=\"right\"></a></p>\n",
		image.link,
		image.url,
		image.title
	)
end

# itemタグ出力
print "<dl>\n"
rss.items.each do |i|
	printf( "\t<dt><a href=\"%s\">%s</a></dt>\n\t<dd>%s</dd>\n",
		i.link,
		i.title,
		i.description
	)
end
print "</dl>\n"

# HTMLの出力終了
print "</body>\n</html>\n"

exit;

更新履歴

2007-08-19
nilチェックをさせたら動いた。モジュールなら、自動的にやってくれればいいものを。
2007-08-02
公開。このモジュールではパース出来ないRSSも多く、あまり使えるものにはなっていない。

XML/RSS(PHPでRSSをパースする)

RSSファイルを参照し、オリジナルのリーダーを作成します。
RSSの解説は、RSSによるサイトの情報の要約と公開を参考にしました。
XML_RSSパッケージの解説は、XML_RSSを参考にしました。
使用したXML_RSSパッケージのバージョンは1.14(0.9.10)でした。
XML_RSSパッケージは、PHPのバージョン5.2.1ではインストールされていません。

インストール方法

XML_RSSをインストールすると、XML_Treeも同時にインストールされます。

pear install -a XML_RSS

サンプル

http://pear.php.net/のRSS

構文

<?php
require_once( "XML/RSS.php" );
// RSSファイルのURL
$rss = new XML_RSS( "http://pear.php.net/feeds/latest.rss" );
// RSSのパース
$rss -> parse();
// channnelタグ出力
$channel = $rss -> getChannelInfo();
printf( "<html>\n<head>\n\t<title>RSS - %s</title>\n</head>\n",
  $channel['title']
);
printf( "<h1><a href=\"%s\">%s</a></h1>\n<p>%s</p>\n",
  $channel['link'],
  $channel['title'],
  $channel['description']
);
// imageタグ出力
if( isset( $rss -> images ) ){
  foreach( $rss -> getImages() as $image ){
    if( !count($image) ){ continue; }
    printf( "<p><a href=\"%s\"><img src=\"%s\" alt=\"%s\" align=\"right\"></a></p>\n",
      $image['link'],
      $image['url'],
      $image['title']
    );
  }
}
// itemタグ出力
echo "<dl>\n";
foreach( $rss -> getItems() as $item ){
  printf( "\t<dt><a href=\"%s\">%s</a></dt>\n\t\t<dd>%s</dd>\n",
    $item['link'],
    $item['title'],
    isset( $item['description'] ) ? $item['description'] : ""
  );
}
echo "</dl>\n";
// HTMLの出力終了
echo "</body>\n</html>";
?>

更新履歴

2008/04/04
サイト移動に伴うHTMLの修正(旧URI:[廃止])
2007/07/31
PHPXML_RSSとあわせるための細かな修正
2007/07/30
公開

XML::RSS(PerlでRSSをパースする)

  現在はバージョン1.33が公開されています。

RSSファイルを参照し、オリジナルのリーダーを作成してみます。
RSSの解説は、RSSによるサイトの情報の要約と公開を参考にしました。
このモジュールは、ローカルに保存したファイルのタイムスタンプを比較し、無駄なトラフィックを回避しているそうです。
使用したXML::RSSモジュールのバージョンは1.12でした。
Perlのバージョンが5.8では、インストールされていません。
動作確認を行ったXML::RSSのバージョンは1.12です。最新版は確認しておりません。

インストール方法

CPANからインストール

以下のように、パッケージを直接指定しなければなりません。
CPANでインストールすると、バージョンは1.32です。

cpan install S/SH/SHLOMIF/XML-RSS-1.32.tar.gz

ppmでインストール

モジュール名の指定でインストールできます。
ppmでインストールすると、バージョンは1.12です。

ppm install XML-RSS

サンプル

http://search.cpan.orgのRSS

構文

#!/perl/bin/perl
use strict;
use XML::RSS;
use LWP::Simple;
# RSSファイルのURL
my $url = 'http://search.cpan.org/uploads.rdf';
# 保存ファイルパス
my $file = './rss';
# RSS更新確認(ここで$fileが最新になる)
mirror( $url, $file );
# RSSパース
my $rss = new XML::RSS;
$rss -> parsefile( $file );
# HTMLの出力開始
print qq|Content-type: text/html\n\n|;
# channnelタグ出力
my $channel = $rss -> {'channel'};
printf( qq|<html>\n<head>\n\t<title>RSS - %s</title>\n</head>\n<body>\n|,
  $channel -> {'title'},
);
printf( qq|<h1><a href="%s">%s</a></h1>\n<p>%s</p>\n|,
  $channel -> {'link'},
  $channel -> {'title'},
  $channel -> {'description'},
);
# imageタグ出力
my $image = $rss -> {'image'};
printf( qq|<p><a href="%s"><img src="%s" alt="%s" align="right"></a></p>\n|,
  $image -> {'link'},
  $image -> {'url'}, 
  $image -> {'title'},
);
# itemタグ出力
print qq|<dl>\n|;
foreach my $item ( @{$rss -> {'items'}} ){
  printf( qq|\t<dt><a href="%s">%s</a></dt>\n\t<dd>%s</dd>\n|,
    $item->{'link'},
    $item->{'title'},
    $item->{'description'},
  );
}
print qq|</dl>\n|;
# HTMLの出力終了
print qq|</body>\n</html>|;
exit;

更新履歴

2008-08-31
バージョン1.33公開の追記
2008-04-04
サイト移動に伴うHTMLの修正(旧URI:[廃止])
2007-07-31
PHPのXML_RSSとあわせるための細かな修正
2007-07-30
公開

HTML::AA 0.10 原文

「翻訳」ではなく「原文」なのは、私が作ったモジュールだからです。
HTML::AAモジュールのバージョンは0.10です。
なお、perlmanの内容とは異なります。次期バージョン(UTF-8対応予定)であわせます。
コードの説明は、PHPのHTML/AAパッケージの方が詳しいです。
構文はほぼ同じなので読み替えてください。

モジュールのバグについて

以下のような指摘を頂きましたので掲載しておきます。(2010-02-17記)

#  名無しさん Says:
2月 17th, 2010 at 2:49 PM e

エントリとは関係ないですが、バグ報告です。
PerlのHTML::AAにおいて、文字の0を数字とみなすことによって
エラーが発生します。
270 my @array;
271 while($str) {
272 $str =~ s/(.)//;

を

270 my @array;
271 while($str ne ”) {
272 $str =~ s/(.)//;
にするとうまくいきましたので、ご報告まで。

説明

HTML::AAPerlモジュールです。
AAアスキーアート(Ascii Art)と同じ要領で、アスキーアジャスト(Ascii Adjust)を行います。
このモジュールは、ブラウザに表示する文字列を整形する機能を有します。
アスキーアートほどの表現力はありませんが、文字列の横ピクセル数を計算したり、面倒な右揃え等の整形をすることが出来ます。
このモジュールは、UnitedDevicesの日報支援サイト「UD-Team2ch 404」を作ったことがきっかけです。
UTF-8への対応も予定しておりますので、しばらくお待ちください。
ご意見、ご感想は、モジュール内に記載されているメールアドレスまでお寄せください。
元はWWW::AAとして公開しておりましたが、カテゴリが違うという判断から0.10よりHTML::AAに変更いたしました。

特徴

罫線表示が必要な場合に有効な、指定サイズ(罫線の倍数)の倍数での最小サイズを求めるshorter_multipleを実装しています。

注意

エンコードはEUC-JP、Shift_JISに対応しています。
作者は英語が全然出来ないので、翻訳ソフトにかけた英文で記述されています。
解説は、このページが一番詳しく、判りやすいと思います。
文字コードが異なる場合には、正常な結果を得ることができません。
MS Pゴシック12ポイントで表示した場合に限り、正常に表示できると予想されます。
文字列の先頭に半角スペースが出力された場合、それが行頭になるとずれる現象が発生します。
詳しくは、アスキーアートを紹介しているサイト等を参考にしてください。
原則、日本語の文字(概ね2バイト文字)のみの入力においてのみ正常な動作を保証いたしますが、半角スペース以外は正常に動作することを確認しています。
文字列内に半角スペースの連続が混入している場合、表示の際にずれます。対策処理を検討中。

解説

アスキーコードで正規表現を利用していますが、主要な部分は次の通りです。
判別しやすいように、文字のままで表記しています。
これは、プロトタイプとしてJavaScriptで作成したものを少し修正したものです。

my $str  = shift;
my $count = 0;
$count += 15 * ($str =~ s/ー|M|m|あ|い|お|け|す|そ|ぞ|た|だ|つ|づ|に|ひ|び|ぴ|ん|ウ|オ|ガ|キ|ギ|グ|ケ|ゲ|ズ|セ|ダ|チ|ヂ|ヅ|デ|ナ|ニ|ネ|ヘ|ベ|ペ|ホ|ボ|ポ|ユ|ワ|ヴ//g);
$count += 14 * ($str =~ s/え|き|ぎ|ご|ざ|ち|ぢ|て|で|ど|な|ま|ゃ|ゅ|よ|る|ろ|ゎ|を|ア|エ|ゴ|シ|ジ|ス|ゾ|ツ|テ|ビ|ピ|ブ|プ|マ|モ|レ|ロ|ン//g);
$count += 13 * ($str =~ s/O|Q|ぃ|ぉ|ぐ|こ|っ|も|ら|イ|ォ|カ|ク|コ|ソ|ヌ|フ|ャ|ュ|ラ|ヲ//g);
$count += 12 * ($str =~ s/M|W|m|ヽ|ヾ|ゝ|B|C|D|G|H|K|N|R|S|U|w|ぁ|ぇ|さ|し|じ|と|ょ|り|ァ|ゥ|ェ|タ|ッ|ヒ|メ|ヨ|リ|ヮ|ヵ|ヶ//g);
$count += 11 * ($str =~ s/@|C|G|O|Q|サ|ム|ヤ|ル|、|。|,|.|ゞ|0|1|2|3|4|5|6|7|8|9|A|E|P|V|う|ド|ノ|ミ| //g);# ←最後に全角スペースがあります
$count += 10 * ($str =~ s/&|A|B|D|H|K|N|P|R|S|U|V|X|w|ー|ア|ウ|エ|オ|キ|ケ|ス|セ|チ|ツ|テ|ナ|ニ|ネ|ハ|ヘ|ホ|マ|モ|ユ|F|J|L|T|X|Y|Z|b|d|h|k|n|o|p|q|u|ぅ|ィ|ト|ョ//g);
$count +=  9 * ($str =~ s/E|F|J|L|T|Y|Z|a|c|e|g|s|く|ヲ|イ|カ|ク|コ|シ|ソ|タ|ヌ|フ|ラ|レ|ロ|ワ|ン//g);
$count +=  8 * ($str =~ s/a|b|c|d|e|h|n|o|p|q|u|v|y|"|#|$|%|*|+|-|/|0|1|2|3|4|5|6|7|8|9|<|=|>|\|ァ|ゥ|ェ|ォ|ャ|ュ|ッ|ノ|ヒ|メ|ヨ|リ|・|:|;|゛|゜|´|`|¨|^|‐|‘|’|“|”|(|)|〔|〕|[|]|{|}|〈|〉|《|》|「|」|『|』|【|】|†|‡|¶|v|x|y|z//g);
$count +=  7 * ($str =~ s/?|^|`|g|k|s|x|z|~|「|」|・|ィ|ョ|ト|ミ|。|、//g);
$count +=  6 * ($str =~ s/r|t|r//g);
$count +=  5 * ($str =~ s/(|)|[|]|_|f|f|t| //g);# ←最後に半角スペースがあります
$count +=  4 * ($str =~ s/!|I|j|{|||}|゙|゚|I|i|j|l//g);
$count +=  3 * ($str =~ s/'|,|.|:|;|i|l//g);
$count += 16 * ($str =~ s/../g);
return $count;

文字とそのドット数(ピクセル数)の関連性は、「アスキーアート」で検索したページで、解説が見つかると思います。

使い方(EUC-JPの場合)

use HTML::AA;
my $aart = new HTML::AA;
#------------------- モジュールが処理をする文字コードを指定します。EUC-JPならuec、Shift_JISならsjis
$aart -> code('euc');
my $dot;
my $str = '整形したい文字列です。';
my @str = ('整形したい文字列です。','このような感じで整形することが出来ます。');
print  qq|Content-type: text/html; charset=EUC-JPnn|;
print  qq|<body>n|;
print  qq|HTML::AAのサンプルです。<br>n|;
#------------------- 文字列のドット数を求める
print  qq|<br>n文字列のドット数を求める<br>n|;
# 文字コードを引数で指定する場合
$dot = $aart -> calcu($str, 'euc');
printf qq|「%s」のドット数は、%dです。<br>n|, $str, $dot;
#------------------- 指定したドット数で整形する(undefではなく''空値を指定すること)
print  qq|<br>n指定したドット数で整形する<br>n|;
# $strと''の間に調整ドットを右寄せで整形
printf qq|│%s│<br>n|, $aart -> adjust($str, '', 'R', 350);
# $strと''の間に調整ドットを左寄せで整形
printf qq|│%s│<br>n|, $aart -> adjust($str, '', 'L', 350);
# ''と$strの間に調整ドットを右寄せで整形
printf qq|│%s│<br>n|, $aart -> adjust('', $str, 'R', 350);
# ''と$strの間に調整ドットを左寄せで整形
printf qq|│%s│<br>n|, $aart -> adjust('', $str, 'L', 350);
# $strと$strの間に調整ドットを右寄せで整形
printf qq|│%s│<br>n|, $aart -> adjust($str, $str, 'R', 350);
# $strと$strの間に調整ドットを左寄せで整形
printf qq|│%s│<br>n|, $aart -> adjust($str, $str, 'L', 350);
#------------------- 配列内の文字列が揃う最小のドット数を求める
print  qq|<br>n配列内の文字列が揃う最小のドット数を求める<br>n|;
$dot = $aart -> shorter(@str);
printf qq|│%s│<br>n|, $aart -> adjust($_, '', 'R', $dot) foreach @str;
printf qq|│%s│<br>n|, $aart -> adjust($_, '', 'L', $dot) foreach @str;
printf qq|│%s│<br>n|, $aart -> adjust('', $_, 'R', $dot) foreach @str;
printf qq|│%s│<br>n|, $aart -> adjust('', $_, 'L', $dot) foreach @str;
print qq|</body>n|;

結果は次のとおりです。

HTML::AAのサンプルです。

文字列のドット数を求める
「整形したい文字列です。」のドット数は、162です。

指定したドット数で整形する

│整形したい文字列です。                   .│
│整形したい文字列です。.                   │
│                   .整形したい文字列です。│
│.                   整形したい文字列です。│
│整形したい文字列です。 .....整形したい文字列です。│
│整形したい文字列です。..... 整形したい文字列です。│

配列内の文字列が揃う最小のドット数を求める

│整形したい文字列です。             .│
│このような感じで整形することが出来ます。│
│整形したい文字列です。.             │
│このような感じで整形することが出来ます。│
│             .整形したい文字列です。│
│このような感じで整形することが出来ます。│
│.             整形したい文字列です。│
│このような感じで整形することが出来ます。│

動作サンプル

サンプル

補足

各バージョンごとに使い方が変わると思います。ご注意ください。
$aart -> code(‘euc’);で文字コードを指定しない場合は、初期値のEUC-JPで処理されます。
宣言は何度でも行えます。その宣言は、それより後の処理で使用される文字コードに反映されます。
個別にコードを指定する使用方法があります。興味のある方はソースを見てください。

インストール方法

プロンプトにて、「cpan install HTML::AA」とすることでインストールできます。
または、CPANよりダウンロードできます

おまけ(Excite翻訳にかける前の原文)

#-------------------------------------------------------------------------------
# モジュール宣言
#-------------------------------------------------------------------------------
sub new {}
#-------------------------------------------------------------------------------
# 文字コードを宣言します
#-------------------------------------------------------------------------------
my $code = 'euc';
#-------------------------------------------------------------------------------
# モジュールが処理する文字コードを宣言します
# 文字コードを指定しない呼び出しで有効です
# EUC-JPで処理したいならeuc
# $aart -> code('euc');
# Shift_JISで処理したいならsjis
# $aart -> code('sjis');
#-------------------------------------------------------------------------------
sub code {}
#-------------------------------------------------------------------------------
# ドット数を計算します
# $aart -> calcu($str);
#-------------------------------------------------------------------------------
sub calcu {}
# 文字コード宣言を無視してEUC-JPで処理したい時
# $aart -> calcu_euc($str);
sub calcu_sjis {}
# 文字コード宣言を無視してShift_JISで処理したい時
# $aart -> calcu_sjis($str);
sub calcu_sjis {}
#-------------------------------------------------------------------------------
# 文字列の変数を1文字の配列に分解します
# $aart -> divide($str);
#-------------------------------------------------------------------------------
sub divide {}
# 文字コード宣言を無視してEUC-JPで処理したい時
# $aart -> divide_euc($str);
sub divide_euc {}
# 文字コード宣言を無視してShift_JISで処理したい時
# $aart -> divide_sjis($str);
sub divide_sjis {}
#-------------------------------------------------------------------------------
# 調整ドットを加えた文字列を返します
# $aart -> adjust($str_l, $str_r, position, $size);
#-------------------------------------------------------------------------------
sub adjust {}
# 配置'R'と文字コード宣言を無視してEUC-JPで処理したい時
# $aart -> adjust_right_euc($str_l, $str_r, $size);
sub adjust_right_euc {}
# 配置'L'と文字コード宣言を無視してEUC-JPで処理したい時
# $aart -> adjust_left_euc($str_l, $str_r, $size);
sub adjust_left_euc {}
# 配置'R'と文字コード宣言を無視してShift_JISで処理したい時
# $aart -> adjust_right_sjis($str_l, $str_r, $size);
sub adjust_right_sjis {}
# 配置'L'と文字コード宣言を無視してShift_JISで処理したい時
# $aart -> adjust_left_sjis($str_l, $str_r, $size);
sub adjust_left_sjis {}
#-------------------------------------------------------------------------------
# 配列の文字列が揃う最小ドット数を返します
# $aart -> shorter(@array);
#-------------------------------------------------------------------------------
sub shorter {}
# 文字コード宣言を無視してEUC-JPで処理したい時
# $aart -> shorter_euc(@array);
sub shorter_euc {}
# 文字コード宣言を無視してShift_JISで処理したい時
# $aart -> shorter_sjis(@array);
sub shorter_sjis {}
#-------------------------------------------------------------------------------
# 配列の文字列が揃う指定された数の倍数に当たる最小ドット数を返します
# ($minimun, $magnification) = $aart -> shorter_multiple($width, @arrayL, @arrayR);
#-------------------------------------------------------------------------------
sub shorter_multiple {}
# 文字コード宣言を無視してEUC-JPで処理したい時
# ($minimun, $magnification) = $aart -> shorter_multiple_euc($width, @arrayL, @arrayR);
sub shorter_multiple_euc {}
# 文字コード宣言を無視してShift_JISで処理したい時
# ($minimun, $magnification) = $aart -> shorter_multiple_sjis($width, @arrayL, @arrayR);
sub shorter_multiple_sjis {}

更新履歴

2010-02-17
バグの指摘を掲載
2008-04-03
サイト移動に伴うHTMLの修正(旧URI:[廃止])
2006-10-10
WWW::AAというカテゴリがおかしいと判明したので、HTML::AAに変更 バージョンを0.10
2006-10-04
動作速度が向上するように変更 バージョン0.06
2006-10-09
エスケープシーケンスを1文字としていたのを除去(文字列から削除)に変更。Shift_JISに対応。バージョン0.05
2006-10-04
翻訳の見直しと共に、原文を掲載。ローカルのファイルでは文字列を1文字の配列にする機能を追加。
2006-09-29
WWW::AAサンプルを追加
2006-09-28
コメントをばっさり削除、エラーが出ないように補正、見た目の修正と、コメントの強化などで0.02にバージョンアップ
2006-09-27
プロトタイプとしてWWW:AA0.01をCPANに登録