旧バージョンのMTでPerl5.26(Perl5.24以降)に対応する方法

旧バージョンのMTでPerl5.26(Perl5.24以降)に対応する方法

Posted at June 30,2022 11:55 PM
Tag:[MovableType, TroubleShooting]

旧バージョンのMTでPerl5.26(Perl5.24以降)に対応する方法を紹介します。

一部MTQで私が回答したものですが、こちらにまとめておきます。

1.問題点

旧バージョンのMT(ここではMT5.2)をPerl5.26の環境で実行すると、

Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/%s/

それから、

Got an error: \C no longer supported in regex; marked by <-- HERE in m/(\ <-- HERE C)/

というエラーが発生するようです。

2.原因

Perl公式マニュアルに下記の説明がありましたので引用します。

まず5.26.1の記載です。先頭の(F)は「致命的なエラー」を示します。

Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/%s/
 
(F) 正規表現中で リテラルな "{" 文字 (U+007B LEFT CURLY BRACKET) にマッチングしたいときに 覚えておくべき単純な規則は、何らかの方法で それぞれのリテラルな実体をエスケープすることです。 一般的に一番簡単なのは、"\{" のように逆スラッシュを前置するか、 かっこでかこむ ("[{]") ことです。. パターン区切り文字も中かっこの場合、マッチングする右中かっこ ("}") も、パーサーの混乱を避けるためにエスケープするべきです; 例えば:
 
     qr{abc\{def\}ghi}
 
リテラルな "{" 文字にエスケープを強制することにより、 将来のリリースで様々な方法で Perl 言語を拡張できるようになります。 既存のコードを不必要に壊すことを避けるために、 拡張が "{" をリテラルとして使うことと競合しそうにない文脈では 制限は強制されません。
 
このリリースの Perl では、"{" のリテラルな使用法の一部は致命的エラーで、 一部は単に廃止予定です。 これは見落としによるものです: v5.20 から廃止予定警告をだすべきだった リテラルな "{" の使用法の一部は v5.26 まで警告されていませんでした。 すでに警告されていた使用法を今致命的エラーにすることで、 言語に計画されていた拡張の一部をより早く実行できます。
 
警告やエラーが出ない文脈は:
 
  パターンの最初の文字、あるいは行頭にマッチングすることを示す "^" に引き続いている場合。
  代替を示す "|" に引き続く最初の文字の場合。
  次のようなかっこ付きグループの最初の文字の場合:
     /foo({bar)/
     /foo(?:{bar)/
  量指定子に引き続く最初の文字の場合
     /\s*{/

要するに、正規表現で左カーリーブラケットを文字列として利用する場合は、一部の場合を除いてエスケープが必要になるようです。

次に5.24.1の記載です。

\C no longer supported in regex; marked by <-- HERE in m/%s/
 
(F) \C 文字クラスは、複数バイトの UTF8 文字の単一のバイトに マッチングできるようにしていましたが、 カプセル化を壊し、その実装が極めてバグっぽいので、v5.24 で削除されました。 本当に個々のバイトを処理する必要があるなら、 おそらくその文字列を、utf8::encode() を使って、 元となっているバイトそれぞれを文字として保持する文字列に変換した方が 良いでしょう。

要するに、Perl5.26(厳密には5.24)では正規表現で"\C"が使えなくなったようです。5.22までは\Cは使えるようです。

3.対処

1つめのエラーについて、lib/MT/App/CMS.pmの下記の部分を書き換えます。MTバージョンによって行番号が異なるかもしれません。

4828行目

変更前

$css =~ s#{{support}}/?#$app->support_directory_url#ie;

変更後

$css =~ s#\{\{support}}/?#$app->support_directory_url#ie;

4830行目

変更前

$css =~ s#{{theme_static}}/?#$theme->static_file_url#ie;

変更後

$css =~ s#\{\{theme_static}}/?#$theme->static_file_url#ie;

1つめのエラーについて、extlib/URI/Escape.pmの下記の部分を書き換えます。

変更前

sub escape_char {
    return join '', @URI::Escape::escapes{$_[0] =~ /(\C)/g};
}

変更後

sub escape_char {
    # Old versions of utf8::is_utf8() didn't properly handle magical vars (e.g. $1).
    # The following forces a fetch to occur beforehand.
    my $dummy = substr($_[0], 0, 0);
 
    if (utf8::is_utf8($_[0])) {
        my $s = shift;
        utf8::encode($s);
        unshift(@_, $s);
    }
 
    return join '', @URI::Escape::escapes{split //, $_[0]};
}

なお、動作を保証するものではありませんので、個人の責任で行ってください。

4,参考サイト

関連記事
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)