qr のメリットがわからない

Perl にはクォーテーションと同義の表記

my $s;
$s = q{abc};   # 'abc'
$s = qq{abc};  # "abc"
$s = qx{abc};  # `abc`

my @a = qw{a b c};  # ('a', 'b', 'c')

などがあります。ウェブアプリで HTML に文字列を埋め込むときなど,ダブルクォーテーションを使ったりしますから重宝します。

my $s = qq~<img src="${image_file}" />~;

とか。あと qw もよくつかいますね。

このような演算子の仲間に qr というのがありまして,

my $qr = qr/[a-z]+/;

my $str = '123abcABC';
$str =~ m/${qr}/;

こんな感じで正規表現をあらかじめコンパイルして再利用できます。

でも,qr// のところは,実は q{} や qq{} ,もっといえば普通の変数でも実際に使うときに正規表現として展開されます。

my $qq = "[a-z]+";

my $str = '123abcABC';
$str =~ m/${qq}/;

簡単なベンチマークをとってみたのですが,qr の方が圧倒的に速いというシチュエーションには巡りあえませんでした。とても複雑な正規表現でないと差がでてこないのでしょうか。

ちなみに,実行時(というかコンパイルフェーズ時)一度だけ正規表現コンパイルするオプション「o」がありますが

my $str = '123abcABC';
$str =~ m/[a-z]+/o;

これはスピードの面ではかなり効果的でした。