この記事は、Perl Advent Calendar 2024 9日目の記事(穴埋め)です。 8日目は@xtetsuji(Tetsuji OGATA)で「時間を毎秒カウント出力するシェルスクリプトの遅れの考察」でした。
Perl 5.41.2(開発版)から source::encodingプラグマが追加されました。
このプラグマの追加により、UTF-8で書かれたソースコードでは use utf8
が必須になります。
TL;DR
ソースコードの先頭に use utf8
って書いておけばOK。
use utf8の必須化
たとえば以下のコードにはUTF-8の文字列が含まれていますが、 use utf8
の指定がありません。
use v5.41;
# こんにちは世界
このコードをPerl 5.41.2(開発版)で実行すると以下のようなエラーを吐いて終了します。
Use of non-ASCII character 0xE3 illegal when 'use source::encoding "ascii"' is in effect at hoge.pl line 3, at end of line
Execution of hoge.pl aborted due to compilation errors.
コメントアウトしてあっても日本語は使えないんですね。
正しく実行するには use utf8
を明示し、ソースコードがUTF-8で書かれていることを示す必要があります。
use v5.41;
use utf8;
# こんにちは世界
これは use utf8
をうっかり書き忘れることを防ぐための処置だそうです。
source::encodingプラグマ
use utf8
必須化の機能のみを制御するには、source::encoding
プラグマを利用します。
たとえばソースコードがASCIIで書かれていることを示すには以下のように書きます。
use source::encoding 'ascii';
# You can use only ASCII characters.
use source::encoding 'ascii'
が指定されているソースコードでASCIIコード範囲外の文字を使うとエラーになります。
use source::encoding 'ascii';
# 日本語はエラーになる!
use v5.41
feature bundle で use source::encoding 'ascii'
も有効化されるため、
use v5.41
が使われているソースコード中で日本語を書くとエラーになります。
日本語のようなASCII範囲外の文字を使いたい場合は use source::encoding 'utf8'
と書いて、UTF-8でエンコードして保存します。
use source::encoding 'utf8'; # use utf8; と同じ
# ASCII範囲外の文字が含まれていてもエラーにならない
use utf8
は use source::encoding 'utf8'
のシノニムなので、use utf8
と書いても同じ効果を得られます。
文字コードとして指定できるのは ascii
と utf8
のみです。
他の文字コードには対応していません。
use source::encoding 'euc-jp'; # Bad argument for source::encoding: 'euc-jp'
まとめ
以前から use utf8
をつけて、ソースコードがUTF-8であることを明示できましたが、use utf8
の設定は必須ではありませんでした。
しかし、Perl 5.41.2(開発版)以降、ソースコードがUTF-8であるのにもかかわらず use utf8
の指定を忘れると、エラーが発生するようになります。
僕らのような日本語話者にとっては重要な変更ですね。
「ここまでの話難しすぎて何言っているかわからない」という人は、「ソースコードの先頭に use utf8
って書いておけばOK」とだけ覚えておきましょう。
今どきutf-8以外のエンコーディングでソースコードを書く機会なんてないでしょうから(フラグ)。
なお検証に使用したのは開発版のPerlです。安定版では挙動が変わる可能性があります。
🐇
新しいプラグマ、嬉しさ満載、
Perlが進化し、未来も開け。
エンコーディングの光、さあ照らせ、
コードが踊り、心も弾む。
ようこそ、変化の時よ!
🌟by CodeRabbit
明日10日目はTBDで「TBD」です。 お楽しみに!