Perl Hackers Hub

第46回 Perl 5.26で変わること(2)

この記事を読むのに必要な時間:およそ 1 分

前回の(1)こちらから。

encodingプラグマの仕様変更とその対策

Perl 5.26には,ほかにも古いバージョンのPerlからアップグレードするとエラーになる変更がいくつかあります。encodingプラグマの仕様変更もその一つです。

従来はencodingプラグマにエンコーディングを渡しておけば,UTF-8以外の文字コードで書かれたモジュールやライブラリでも適切にPerlの内部表現に変換されていました。

# 日本語Windows環境でShift_JISのままコードを書いても,
# encodingを使えば正規表現などを正しく扱えた
use encoding "cp932";
my $string = "表示";
$string =~ s/表/掲/; # プラグマなしだと5C問題(注6)でエラー
print length($string); # 2

この挙動はPerl 5.22で廃止対象となり警告が出ていたのですが,Perl 5.26ではエラーに変わりました。

ただし,5.26でも次のようにFilterオプションを使えば,Perlに内蔵されているソースフィルタ機能を使って同等のことを実現できます。

use encoding "cp932", Filter => 1;

もっとも,この場合でも警告は出続けるので,可能であればコードはUTF-8で書き,utf8プラグマを利用したうえで,必要に応じて入出力ファイルの文字コードを変換するようにしたほうがよいでしょう。

注6)
Shift_JIS - Wikipedia「2バイト目が5C等になりうることによる問題」をご覧ください。

正規表現中の{の扱い

正規表現中に,量指定子なのか文字グループなのか,変数の一部なのかリテラルなのかがあいまいな{が存在していると,Perl 5.22からは警告が出ていましたが,Perl 5.26ではエラーになりました注7)⁠プログラムのソースコード(の一部)を正規表現で解析したり,JSONの一部を正規表現で抜き出すような処理をしていると,この問題に引っかかる可能性があります。エラーや警告が出た場合は量指定子や文字グループ,変数以外の{をすべてエスケープしてください。

$foo =~ /\d{1,10}/;  # OK
$foo =~ /\d{1}/;     # OK
$foo =~ /$foo{bar}/; # OK
$foo =~ /$foo{}/;    # 5.26ではエラー
$foo =~ /foo{/;      # 5.26ではエラー
$foo =~ /foo[{]/;    # OK
$foo =~ /foo\{/;     # OK
$foo =~ /{}/;        # これもOK
注7)
この修正については5.26のリリース直前にautoconfコマンドを壊してしまうことが発覚したため,Perl 5.26では応急処置を施したうえでリリースされ,開発版のPerl 5.27.1ではいったんこの変更を取り下げて警告が出る状態に戻しています。

<続きの(3)こちら。>

WEB+DB PRESS

本誌最新号をチェック!
WEB+DB PRESS Vol.104

2018年4月24日発売
B5判/168ページ
定価(本体1,480円+税)
ISBN978-4-7741-9688-6

  • 特集1
    [モダンなコードをギュッと凝縮!]イマドキPython入門
    文法,機械学習,Web開発を一気に学ぼう
  • 特集2
    いきなりiPhoneアプリ開発
    カメラの写真を加工してTwitter投稿!
  • 特集3
    はじめてのUnity
    シューティングゲームを作ろう!

著者プロフィール

石垣憲一(いしがきけんいち)

翻訳家兼プログラマ。歴史ネタ担当。最近は主にCPANツールチェーン界隈の片隅で活動中。

URL:http://d.hatena.ne.jp/charsbar/

コメント

コメントの記入