1文字ごとに<br>タグを挿入するルーチンを見てください。
文字列があって、1文字1文字の後ろに<br>タグを挿入して、たてに表示させたいと思います。
一応このようなサブルーチンを考えました。
sub insertChar{
local $string = $_[0];
local $char = $_[1];
local $new = '';
local @chars = ();
local $temp = '';
while($string =~ s/^.//){
###全角の1バイトめがtempに入っていたら。2バイトめと一緒に配列に入れる。
if ($temp) {$temp .= "$&"; push (@chars, $temp); $temp = '';next;}
###tempが空のばあい、半角文字じゃないかどうかをチェック。半角文字で無ければtemp変数に取っておく。
if ($& =~ /[^a-zA-Z0-9_?,.!@\\\/\~\*\&\^\%\$\#\-\+\s\(\)\[\]\"\'\{\}\<\>\:\;\`\|]/) {$temp = "$&"; next;}
###tempが空で、全角の1バイトめでもなかったら半角文字ということで、素直に配列に入れる。
push (@chars, "$&");
}
$new = join ("$char", @chars);return $new;
}
これを
$hoge = &insertChar("$hoge",'<br>');
見たいな感じで使っています。実際期待通りに動いてはいるんですが、なんかきっともっとスマートなやり方があると思うんです。
とくに、半角文字を判断させるところはとにかく思い付く限りの半角もじをリストアップさせているだけで、しかも、どれをエスケープすべきかわからないので全部エスケープさせてしまいました。
一応どういうロジックで処理しているか説明しますと、受け取った文字列を1バイトづつ判断し、それが半角英数記号文字だったら@chars配列へ格納し、半角英数記号文字以外は2バイト文字の1バイトと目判断して$tempに格納、次の2バイトめと一緒にして、@charに格納。最後にjoinです。
なんか、もっと優雅な方法ってないものでしょうか?
よろしくお願いします。
お礼
Asc()を使うことがわかりました。 どうもありがとうございました。
補足
アスキーコードを取得するにはどうすればいいのでしょうか・・・ すみません・・・