Compress関数

「#--Compress」で検索すると確実にヒットします。

この関数は、指定した文字列を整形します。

どのように整形するのかというと、1行あたりの文字数と、それを何行にするのかを指定し、それ以上の文字はカットします。

引数は整形したい文字列、1行あたりの文字数と行数です。

戻り値は、整形後の文字列です。

それでは、この関数の流れを見てみましょう。

準備

まずは、整形対象となっている文字列と、文字列がオーバーしたときに表現する記号(この場合は「…」)に、Utf8Flag関数でUtf8フラグを立てます。

$over_char = &Utf8Flag($over_char, 'on');
$string = &Utf8Flag($string, 'on');

今後の処理で、バイト数ではなく文字そのものに対して処理を行いたいからですね。

次に、整形対象の文字中の余計な要素を取り除きます。

$string =~ s/\x0D\x0A|\x0D|\x0A//g;
$string =~ s/<[^>]*>//gs;

改行コードと、HTMLタグを取り除いています。

これで、純粋な文字列になりました。

カット

次に、整形に不要な文字をカットします。

my @chars = $string =~ /./og;
my $total_chars = $lines * $line_chars;

配列「@chars」の各要素には、整形対象の文字が1文字ずつ格納されます。

変数「$line_chars」には、1行あたりの文字数が指定されています。

変数「$lines」には、行数が指定されています。

なので、この2つをかけることにより整形に必要な文字数がわかります。

それを変数「$total_chars」に代入します。

次に、整形対象の文字列が、整形に必要な文字数よりも多い場合はカットします。

もし文字をカットした場合は、カットした文字列の末尾の文字を、文字列がそれ以上存在していたことを表す記号に入れ替えます。

if ($total_chars < scalar @chars) {
splice (@chars, $total_chars);
$chars[$#chars] = $over_char;
}

配列「@chars」の要素数=整形対象の文字数ですから、比較するのは簡単ですね。

文字のカットは不要な要素をカットすることですから、 splice関数 を使います。

そして最後の要素に、文字がオーバーしたときの記号を代入します。

整形

最後に、指定された文字数で1行を作る作業を、指定された行数分繰り返します。

for (my $i=1;$i<=$lines;$i++) {
$result .= join ("", splice (@chars, 0, $line_chars)) . "<br>\n";
last unless scalar @chars;
}

splice関数で頭から1行に必要な文字列分だけカットします。

カットされた各文字はリスト形式になっているので、 join関数 でひとまとめにします。

さらに、HTMLの改行タグと改行コードを合わせて、変数「$result」に追加代入します。

これを、for関数で指定された行数分か、整形対象文字(配列「@chars」の要素)がなくなるまで繰り返します。

return $result;

整形が完了したら、その結果を返してこの関数終了です。