旧バージョンのMTでPerl5.26(Perl5.24以降)に対応する方法
旧バージョンの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,参考サイト
- MovableTypeアクセス不可(Perl-5.26にするとハマるので要注意)
- Fedora29にMT5.2.2を導入
- perldiag - さまざまな Perl 診断メッセージ(5.24.1)
- Perl5.26のMTOS5.2.13でupdate.cgiが動かないエラー。
Posted by yujiro このページの先頭に戻る
- MovableTypeプラグインの独自CGIをNginxに対応させる方法
- Movable Type 5で「Got an error: Can't use 'defined(%hash)' (Maybe you should just omit the defined()?)」というエラーになる場合の対処
- MT6.2のファイルアップロードで「Undefined subroutine &POSIX::strftime」になる問題の対処
- Movable Typeのファイルアップロードで「アップロードしたファイルは大きすぎます。」というエラーになる場合の対処
- Movable Typeのパスワード変更で「URLが不正です。」というエラーなる件についての対処
- Movable Typeで「Cannot find column 'blogs' for class 'MT::Blog'」となる場合の対処
- Movable TypeでMTPageNextタグが効かなくなる不具合について
- Movable Typeの復元で「Request-URI Too Large」になるときの対処
- サーバ故障と「Connection error: Too many connections」エラーおよびMySQLテーブル破損について
- Movable Typeでエラー発生箇所を特定する方法
- IE9でMovable Typeを利用する方法
- MTIfタグにtagモディファイアを利用する場合の注意事項
- Movable Type 5のブログの設定で「Can't call method &quot;label&quot; on unblessed reference」が発生する問題について
- Movable Type 5.03へのアップグレードで再構築時に「Script Error」が発生する件について(つづき)
- XREA/CORESERVERでMovable TypeのCaptchaが表示されない不具合について
トラックバックURL
コメントする
greeting