Perl6のバッファーとバイナリー入出力

Perl 5では、バージョン5.8以降、Unicodeサポートが適切に実装されていますが、それを使用することの難しさについて人々は依然として不満を述べています。 これは主に、プログラマーがデコードされた行とバイナリデータとして処理される行を追跡する必要があるという事実によるものです。 また、変数を見て、それらがバイナリ文字列かテキストかを理解する信頼できる方法はありません。



Perl6では、この問題は別のタイプを導入することで解決されました。 strはテキストを保存します。 Perl6の文字列リテラルはStr型です。 バイナリデータはBufオブジェクトに格納されます。 そして、彼らはもう混同することはできません。 それらの間の変換は、エンコードおよびデコードメソッドを使用して実行されます。



my $buf = Buf.new(0x6d, 0xc3, 0xb8, 0xc3, 0xbe, 0x0a); $*OUT.write($buf); my $str = $buf.decode('UTF-8'); print $str;
      
      







どちらの操作にも同じ効果があります。標準出力ストリーム「møþ」と改行に出力されます。 Buf.new(...)は、0から255までの整数のリスト(新しいバッファーの作成元のバイト)を受け入れます。 $ * OUT.write($ buf)は、バッファを$ bufから標準出力に出力します。



$ buf.decode( 'UTF-8')はバッファーをデコードし、Strオブジェクトを返します(バッファーにUTF-8の有効な文字列が含まれていない場合はクラッシュします)。 逆の操作は$ Buf.encode($ encoding)です。 strは、単にprintを介して出力できます。



当然、printはプロセスで文字列をバイナリ表現に変換する必要もあります。 これ(および他の同様の操作)の場合、デフォルトのエンコードはUTF-8に設定されます。 Perl6仕様では、ユーザーはデフォルト設定を変更できると述べています(ただし、現時点では、コンパイラーはこれをサポートしていません)。



読み取りには、メソッド.read($ no-of-bytes)(およびBufを取得)または.get(およびStrを取得)メソッドを使用できます。 読み取りおよび書き込みメソッドは、ファイルとストリームだけでなく、ソケットにも存在します。



Perl 5では、連結または他の方法(結合、テキスト補間)を使用して、テキスト文字列とバイナリ文字列を組み合わせることにより、非常に不快な間違いを犯す可能性があります。 結果は「壊れた」文字列になりますが、127バイトを超えるバイトが含まれている場合のみです。このような状況では、コードのデバッグは非常に困難です。



この場合のPerl6では、単に「Bufを文字列として使用できません」というエラーが表示されます。



All Articles