Perl Hackers Hub

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

前回の(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プラグマを利用したうえで、必要に応じて入出力ファイルの文字コードを変換するようにしたほうがよいでしょう。

正規表現中の{の扱い

正規表現中に、量指定子なのか文字グループなのか、変数の一部なのかリテラルなのかがあいまいな{が存在していると、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

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

WEB+DB PRESS

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

2022年8月24日発売
B5判/168ページ
定価1,628円
(本体1,480円+税10%)
ISBN978-4-297-13000-8

  • 特集1
    イミュータブルデータモデルで始める
    実践データモデリング

    業務の複雑さをシンプルに表現!
  • 特集2
    いまはじめるFlutter
    iOS/Android両対応アプリを開発してみよう
  • 特集3
    作って学ぶWeb3
    ブロックチェーン、スマートコントラクト、NFT

おすすめ記事

記事・ニュース一覧