MTのテンプレートで乱数等の関数を使うには

昨日、cremaさんがTwitterに「MTで乱数を使いたいので、ちょっと色々考え中。」とつぶやいていました。
それをネタに記事を書いてみます。

1.rand関数とint関数

Perlには「rand」という関数があり、乱数を生成することができます。
「rand(x)」とすることで、0以上x未満の乱数が生成されます。
例えば、以下のようにすると、変数$aに0以上100未満の乱数が代入されます。

$a = rand(100);

ただし、rand関数の値には小数点以下も含まれます。
値の小数点以下を切り捨てて整数化したい場合は、「int」という関数と組み合わせます。

例えば、以下のように書くと、0以上100未満の乱数を生成し、その小数点以下を切り捨てて、変数$aに代入します。
したがって、変数$aの値は0から99の整数のどれかになります。

$a = int(rand(100));

2.既存のプラグインでテンプレート内で関数を使う

MT4以降では変数の機能が拡張されていて、加減乗除の基本的な計算を行うこともできるようになりました。
ただ、関数を使う機能はありません。

この点を拡張するプラグインが、いくつか公開されています。
いずれも、Perlの関数を、MTの変数処理の中で利用できるようにするものです。
なお、拙作のプラグインは、初版(1.00)ではrand関数が使えなかったので、修正版(1.02)をご利用ください。

例えば、拙作のプラグインを使って、テンプレート内の変数xに0以上10未満(小数点以下も含む)の乱数を代入するには、以下のように書きます。

<MTSetVarFormula name="x" formula="rand(10)">

また、変数xに0~9の整数の乱数を代入するには、以下のように書きます。

<MTSetVarFormula name="x" formula="int(rand(10))">

3.PerlScriptプラグインと組み合わせる

先日PerlScriptプラグインを紹介しましたが、これを使う方法もあります。

PerlScriptプラグインの中では、テンプレートの変数は、「$ctx->var('変数名')」で表すことができます。
また、「$ctx->var('変数名', 値)」とすれば、テンプレートの変数に値を代入することもできます。
これらの書き方を使って、テンプレートの変数をPerlのプログラムで操作することができます。

例えば、「ブログ記事からどれか1つをランダムに選んで、そのタイトルを出力する」という例を考えてみます。
この場合、0から(ブログ記事数-1)の間で整数の乱数を生成し、MTEntriesタグのoffsetモディファイアでその数だけ記事と飛ばして、そこから1件だけ記事を出力すれば良いです。
実際にこの処理を書くと、以下のようになります。

<MTBlogEntryCount setvar="count">
<MTPerlScript>
# 変数$countに、テンプレート変数countの値(ブログ記事数)を代入する
my $count = $ctx->var('count');
# 0~($count - 1)(ブログ記事数 - 1)の乱数を生成して、テンプレート変数xに代入する
$ctx->var('x', int(rand($count)));
</MTPerlScript>
<MTEntries offset="$x" limit="1">
<MTEntryTitle>
</MTEntries>