CGIの解説書などで、データのセパレータとして「|(0x7C)」という文字を使っていたり、クォーテーションの囲み文字として使われているのを見た方は多いと思いますが、データの中に含まれる"|"をデコードの際に取り除かなければ不具合が生じます。
また、パターンマッチで変数を使用する場合、その変数に「|(0x7C)」が含まれていると、メタ文字と解釈されるために、パターンマッチに失敗します。 Perlではパターンに変数が使われていると実行時にコンパイルしますので、「|(0x7C)」を含む文字をマッチングしようとしたときだけServer Errorとなるはずです。
回避方法
-
セパレータを他の文字に変更する
これしか方法はありません。私は現在もっぱら「\t(水平タブ:0x09)」をセパレータに使っています。水平タブコードはS-JISに含まれませんし、その上フォームでは入力フィールドの移動に使われるので、フォームからの入力にタブが含まれることがないからです。囲み文字については、事前に囲む文字列の中に含まれている囲み文字そのものの直前に\を付けてエスケープするか、hereドキュメントを使い、クォーテーションを避ける方法などがあります。
-
パターンマッチの前にEUCにコード変換する
通常のPerlで日本語のパターンマッチをする場合は、文字列をあらかじめEUCコードに変換しておくのがいいでしょう。コード変換はjcode.plなどを使います。
以下に、「|(0x7C)」を含む文字の一覧を挙げておきます。全部で40文字あります。
文字 |
コード |
− |
81 7C |
ポ |
83 7C |
л |
84 7C |
榎 |
89 7C |
掛 |
8A 7C |
弓 |
8B 7C |
芸 |
8C 7C |
鋼 |
8D 7C |
旨 |
8E 7C |
楯 |
8F 7C |
|
文字 |
コード |
酢 |
90 7C |
掃 |
91 7C |
竹 |
92 7C |
倒 |
93 7C |
培 |
94 7C |
怖 |
95 7C |
翻 |
96 7C |
慾 |
97 7C |
處 |
99 7C |
嘶 |
9A 7C |
|
文字 |
コード |
斈 |
9B 7C |
忿 |
9C 7C |
掟 |
9D 7C |
桍 |
9E 7C |
毫 |
9F 7C |
烟 |
E0 7C |
痞 |
E1 7C |
窩 |
E2 7C |
縹 |
E3 7C |
艚 |
E4 7C |
|
文字 |
コード |
蛞 |
E5 7C |
諫 |
E6 7C |
轎 |
E7 7C |
閖 |
E8 7C |
驂 |
E9 7C |
黥 |
EA 7C |
| |
ED 7C |
| |
EE 7C |
` |
FA 7C |
` |
FB 7C |
|