コンテンツにスキップ

Perl/Sjis

出典: フリー教科書『ウィキブックス(Wikibooks)』

Sjis.pm - ShiftJISスクリプト用ソースコードフィルタ

[編集]

概要

[編集]

Sjis.pmは、ShiftJISでエンコードされたPerlスクリプトを扱うためのソースコードフィルタです。UTF-8フラグを使用せずに、ShiftJIS文字列をそのまま扱えるようにする「ミドルウェア」として機能します。文字コードの変換は行わず、エスケープ処理によって文字の値や文字列の長さを保持したまま処理を行います。

インストールと使用方法

[編集]

インストールは以下の2つのステップで行います:

  1. Sjis.pmEsjis.pmをPerlのライブラリディレクトリに配置
  2. スクリプトの先頭に以下のように記述:
use Sjis;

より詳細な使用方法:

use Sjis ver.sion;             # 最小バージョンの指定
use Sjis ver.sion.0;           # 厳密なバージョン指定
use Sjis qw(ord reverse getc); # 特定の機能の要求

動作の仕組み

[編集]

文字列のエスケープ処理

[編集]

Sjis.pmは、ShiftJIS文字列中の特殊文字(@, [, \, ], ^, `, {, |, })の前にエスケープ文字(\)を自動的に挿入します。以下は日本語カタカナ「ソ」(コード: \x83\x5C)の例です:

# 元のスクリプト
"`/"    # [83 5c]

# Sjis.pmによるエスケープ後
"`\/"   # [83 [5c] 5c]

正規表現の拡張

[編集]

ShiftJIS文字列を適切に処理するため、正規表現に関する以下の機能を提供します:

  • 複数バイト文字のアンカリング
  • 二番目のバイトのエスケープ処理
  • 量指定子を含む複数バイト文字のクラスタリング
例:
# 変換前
m/regexp/

# 変換後
m/${Esjis::anchor}(?:regexp).../

組み込み関数の拡張

[編集]

ShiftJIS文字列を適切に扱うため、多くの組み込み関数がEsjis::名前空間の関数に置き換えられます:

# バイト単位で動作
length   length
substr   substr
pos      pos

# 文字単位で動作
split    Esjis::split
tr///    Esjis::tr
chop     Esjis::chop
index    Esjis::index

設計思想

[編集]

Sjis.pmは以下の設計原則に基づいています:

  • 上位互換性の維持(Perl4からPerl5への移行のように)
  • 最大限のポータビリティ(jcode.plのように)
  • 生のShiftJISを扱う単一言語の維持(JPerlのように)
  • 単一インタプリタの維持(Encodeモジュールのように)
  • コードセット非依存(Rubyのように)

実装例

[編集]

基本的なソースコードフィルタの実装例:

package SJIS;
use Filter::Util::Call;

sub multibyte_filter {
    my $status;
    if (($status = filter_read()) > 0 ) {
        s/([\x81-\x9f\xe0-\xef])([\x40-\x7e\x80-\xfc])/
            sprintf("\\x%02x\\x%02x",ord($1),ord($2))
        /eg;
    }
    $status;
}

sub import {
    filter_add(\&multibyte_filter);
}

1;

この実装により、ShiftJISエンコードされたPerlスクリプトを安全に実行できるようになります。

参考文献

[編集]
  • The Perl Conference Japan 1998 - "The future of JPerl" by WATANABE Hirofumi
  • Tokyo.pm メーリングリスト(1999年9月)

外部リンク

[編集]