argra****@users*****
argra****@users*****
2008年 12月 29日 (月) 02:53:24 JST
Index: docs/perl/5.8.8/perlpacktut.pod diff -u docs/perl/5.8.8/perlpacktut.pod:1.6 docs/perl/5.8.8/perlpacktut.pod:1.7 --- docs/perl/5.8.8/perlpacktut.pod:1.6 Sat Dec 6 03:44:53 2008 +++ docs/perl/5.8.8/perlpacktut.pod Mon Dec 29 02:53:23 2008 @@ -66,10 +66,10 @@ Perl では、メモリにランダムにアクセスすることはできませんが、C<pack> と C<unpack> によって提供される構造的および表現的な変換は素晴らしい 代替案です。 -The C<pack> function converts values to a byte -sequence containing representations according to a given specification, -the so-called "template" argument. C<unpack> is the reverse process, -deriving some values from the contents of a string of bytes. (Be cautioned, +C<pack> 関数は、値を、「テンプレート」引数と呼ばれる使用に従った表現を含む +バイト列に変換します。 +C<unpack> は逆処理で、バイトの並びから値を引き出します。 +(Be cautioned, however, that not all that has been packed together can be neatly unpacked - a very common experience as seasoned travellers are likely to confirm.) (TBT) @@ -93,11 +93,12 @@ One good reason is input and output accessing some file, a device, or a network connection, whereby this binary representation is either forced on you or will give you some benefit -in processing. Another cause is passing data to some system call that -is not available as a Perl function: C<syscall> requires you to provide -parameters stored in the way it happens in a C program. Even text processing -(as shown in the next section) may be simplified with judicious usage -of these two functions. +in processing. +もう一つの原因は、Perl 関数として利用できないシステムコールにデータを +渡すときです: C<syscall> requires you to provide +parameters stored in the way it happens in a C program. +(以下の章で示すように) テキスト処理ですら、これら 2 つの関数を賢明に +使うことで単純化できます。 (TBT) =begin original @@ -675,10 +676,8 @@ テキストデータについてはこれくらいです。 C<pack> と C<unpack> が最良である、いやらしい代物: 数値のためのバイナリ フォーマットに進みましょう。 -There is, -of course, not just one binary format - life would be too simple - but -Perl will do all the finicky labor for you. -(TBT) +もちろん、バイナリフォーマットはひとつではありません - 人生はそれほど +単純ではありません - が、Perl は全ての細かい作業を行います。 =head2 Integers @@ -1042,7 +1041,7 @@ =end original -不動小数点数を pack するには、you have the choice between the +浮動小数点数を pack するには、you have the choice between the pack codes C<f> and C<d> which pack into (or unpack from) single-precision or double-precision representation as it is provided by your system. (There is no such thing as a network representation for reals, so if you want @@ -1132,9 +1131,8 @@ =end original -To illustrate unpacking for bit strings, we'll decompose a simple -status register (a "-" stands for a "reserved" bit): -(TBT) +ビット文字列の unpack を図示するために、単純な状態レジスタを分解してみます +("-" は「予約された」ビットを意味します): +-----------------+-----------------+ | S Z - A - P - C | - - - - O D I T | @@ -1171,9 +1169,8 @@ =end original -We could have used an unpack template C<'b12'> just as well, since the -last 4 bits can be ignored anyway. -(TBT) +ちょうど同じように、unpack テンプレート C<'b12'> も使えます; +最後の 4 ビットはどちらにしろ無視されるからです。 =head2 Uuencoding @@ -1256,7 +1253,7 @@ =end original -For string values, C<%> returns the sum of the byte values saving +文字列値に対しては、C<%> returns the sum of the byte values saving you the trouble of a sum loop with C<substr> and C<ord>: (TBT) @@ -1282,9 +1279,8 @@ =end original -In connection with C<b> or C<B>, C<%> simply adds bits, and this can be put -to good use to count set bits efficiently: -(TBT) +C<b> や C<B> と共に使うと、C<%> は単にビットを加えるので、これは +セットされているビットを効率的に数えるためのよい方法となります: my $bitcount = unpack( '%32b*', $mask ); @@ -1294,8 +1290,7 @@ =end original -And an even parity bit can be determined like this: -(TBT) +そして偶数パリティビットは以下のようにして決定できます: my $evenparity = unpack( '%1b*', $mask ); @@ -1371,9 +1366,9 @@ =end original -Inspecting C<$UTF8{Euro}> shows that it contains 3 bytes: "\xe2\x82\xac". The -round trip can be completed with C<unpack>: -(TBT) +C<$UTF8{Euro}> を検査すると、3 バイトであることがわかります: +"\xe2\x82\xac" です。 +往復は C<unpack> を使って完了します: $Unicode{Euro} = unpack( 'U', $UTF8{Euro} ); @@ -1408,8 +1403,8 @@ The pack code C<w> has been added to support a portable binary data encoding scheme that goes way beyond simple integers. (詳細については Scarab プロジェクト L<Casbah.org> にあります。) -A BER (Binary Encoded -Representation) compressed unsigned integer stores base 128 +BER (Binary Encoded Representation) 圧縮符号なし整数は +stores base 128 digits, most significant digit first, with as few digits as possible. ビット 8 (最上位ビット) は、最後以外のバイトでセットされます。 BER エンコーディングにはサイズ制限がありませんが、Perl は極端なことは @@ -1472,7 +1467,7 @@ =end original which returns a string consisting of the first character from each string. -Using pack, we can write +pack を使うと、以下のように書けて (TBT) pack( '(A)'. @ str, @str ) @@ -1484,9 +1479,8 @@ =end original -or, because a repeat count C<*> means "repeat as often as required", -simply -(TBT) +あるいは、繰り返し数 C<*> は「必要なだけ繰り返す」ことを意味するので、 +単に以下のようになります: pack( '(A)*', @str ) @@ -1508,9 +1502,8 @@ =end original -To pack dates stored as triplets ( day, month, year ) in an array C<@dates> -into a sequence of byte, byte, short integer we can write -(TBT) +配列 C<@dates> に 3 つ組 (日、月、年) として保管されている日付を +バイト、バイト、short に pack するには、以下のように書きます $pd = pack( '(CCS)*', map( @$_, @dates ) ); @@ -1521,9 +1514,9 @@ =end original -To swap pairs of characters in a string (with even length) one could use -several techniques. First, let's use C<x> and C<X> to skip forward and back: -(TBT) +ある文字列の中の(同じ長さの)部分文字列の組を交換するには、いくつかの +技が使えます。 +まず、読み飛ばして戻ってくるために C<x> と C<X> を使いましょう: $s = pack( '(A)*', unpack( '(xAXXAx)*', $s ) ); @@ -1534,9 +1527,8 @@ =end original -We can also use C<@> to jump to an offset, with 0 being the position where -we were when the last C<(> was encountered: -(TBT) +また、オフセットに飛ぶために C<@> も使えます; ここで 0 は最後に C<(> に +遭遇した位置になります: $s = pack( '(A)*', unpack( '(@1A @0A @2)*', $s ) ); @@ -1547,9 +1539,8 @@ =end original -Finally, there is also an entirely different approach by unpacking big -endian shorts and packing them in the reverse byte order: -(TBT) +最後に、ビッグエンディアンの short として unpack して、逆のバイト順で +pack するという、全く異なった手法もあります: $s = pack( '(v)*', unpack( '(n)*', $s ); @@ -1668,8 +1659,9 @@ =end original The pack code preceding C</> may be anything that's fit to represent a -number: All the numeric binary pack codes, and even text codes such as -C<A4> or C<Z*>: +number: +全ての数値バイナリ pack コードおよび、C<A4> や C<Z*> のような +テキストコードにも対応します: (TBT) # pack/unpack a string preceded by its length in ASCII @@ -1704,9 +1696,9 @@ =end original -But that second C<unpack> is rushing ahead. It isn't using a simple literal -string for the template. So maybe we should introduce... -(TBT) +しかしこの 2 番目の C<unpack> は先走りました。 +これはテンプレートとして単純なリテラル文字列を使っていません。 +それでは説明するべきでしょう… =head2 Dynamic Templates @@ -1724,6 +1716,14 @@ =end original +So far, we've seen literals used as templates. If the list of pack +items doesn't have fixed length, an expression constructing the +template is required (whenever, for some reason, C<()*> cannot be used). +Here's an example: To store named string values in a way that can be +conveniently parsed by a C program, we create a sequence of names and +null terminated ASCII strings, with C<=> between the name and the value, +followed by an additional delimiting null byte. Here's how: +(TBT) my $env = pack( '(A*A*Z*)' . keys( %Env ) . 'C', map( { ( $_, '=', $Env{$_} ) } keys( %Env ) ), 0 ); @@ -1758,7 +1758,7 @@ =end original -For the reverse operation, we'll have to determine the number of items +逆操作のために、we'll have to determine the number of items in the buffer before we can let C<unpack> rip it apart: (TBT) @@ -1772,9 +1772,9 @@ =end original -The C<tr> counts the null bytes. The C<unpack> call returns a list of -name-value pairs each of which is taken apart in the C<map> block. -(TBT) +C<tr> はヌルバイトを数えます。 +C<unpack> 呼び出しは名前-値の組のリストを返し、そのそれぞれが +C<map> ブロックで分割されます。 =head2 Counting Repetitions @@ -1789,11 +1789,10 @@ =end original -Rather than storing a sentinel at the end of a data item (or a list of items), -we could precede the data with a count. Again, we pack keys and values of -a hash, preceding each with an unsigned short length count, and up front -we store the number of pairs: -(TBT) +データアイテム(あるいはアイテムのリスト)の最後に見張りをおくのではなく、 +データの数を先においておくこともできます。 +再び、ハッシュのキーと値を pack します; それぞれの前には符号なし short で +長さが置かれ、先頭には組の数を保管します: my $env = pack( 'S(S/A* S/A*)*', scalar keys( %Env ), %Env ); @@ -1804,9 +1803,7 @@ =end original -This simplifies the reverse operation as the number of repetitions can be -unpacked with the C</> code: -(TBT) +繰り返し数は C</> コードで unpack できるので、逆操作は単純になります: my %env = unpack( 'S/(S/A* S/A*)', $env ); @@ -1818,10 +1815,9 @@ =end original -Note that this is one of the rare cases where you cannot use the same -template for C<pack> and C<unpack> because C<pack> can't determine -a repeat count for a C<()>-group. -(TBT) +これは、C<pack> は C<()> グループの繰り返し数を決定できないので、 +C<pack> と C<unpack> で同じテンプレートが使えない珍しい場合であることに +注意してください。 =head1 Packing and Unpacking C Structures @@ -1884,9 +1880,8 @@ =end original -To see how this affects C<pack> and C<unpack>, we'll compare these two -C structures: -(TBT) +これが C<pack> と C<unpack> にどのように影響を与えるかを見るために、 +これら 2 つの C 構造体を比較してみます: typedef struct { char c1; @@ -1910,10 +1905,10 @@ =end original -Typically, a C compiler allocates 12 bytes to a C<gappy_t> variable, but -requires only 8 bytes for a C<dense_t>. After investigating this further, -we can draw memory maps, showing where the extra 4 bytes are hidden: -(TBT) +典型的には、C コンパイラは C<gappy_t> 変数には 12 バイトを割り当てますが、 +C<dense_t> には 8 バイトしか割り当てません。 +これをさらに調査した後、余分な 4 バイトが隠れていることが分かる +メモリマップが書けます: 0 +4 +8 +12 +--+--+--+--+--+--+--+--+--+--+--+--+ @@ -1934,9 +1929,9 @@ =end original -And that's where the first quirk strikes: C<pack> and C<unpack> -templates have to be stuffed with C<x> codes to get those extra fill bytes. -(TBT) +そしてこれが最初の思いがけない一撃の理由です: +C<pack> と C<unpack> のテンプレートは、これらの余分に埋めるバイトのために +C<X> コードを詰める必要があります。 =begin original @@ -2123,7 +2118,8 @@ =end original -Where's the catch? Padding is neither required before the first field C<count>, +どこに罠があるのでしょう? +Padding is neither required before the first field C<count>, nor between this and the next field C<glyph>, so why can't we simply pack like this: (TBT) @@ -2217,7 +2213,6 @@ 約束します。 これが望みのものではないですか? 試してみましょう: -(TBT) # allocate some storage and pack a pointer to it my $memory = "\x00" x $size; @@ -2232,7 +2227,7 @@ =end original -ちょっとまった: C<pack> は単にバイトシーケンスを返すのでは? +ちょっと待った: C<pack> は単にバイトシーケンスを返すのでは? How can we pass this string of bytes to some C code expecting a pointer which is, after all, nothing but a number? @@ -2435,8 +2430,8 @@ =end original -It's safe, however, to P- or p-pack a string literal, because Perl simply -allocates an anonymous variable. +It's safe, however, to P- or p-pack a string literal, +なぜなら Perl は単に無名変数を割り当てるからです。 (TBT) =head1 Pack Recipes Index: docs/perl/5.8.8/perlxstut.pod diff -u docs/perl/5.8.8/perlxstut.pod:1.5 docs/perl/5.8.8/perlxstut.pod:1.6 --- docs/perl/5.8.8/perlxstut.pod:1.5 Sat Dec 27 04:58:23 2008 +++ docs/perl/5.8.8/perlxstut.pod Mon Dec 29 02:53:23 2008 @@ -76,6 +76,8 @@ =head2 Version caveat +(バージョンに関する警告) + =begin original When writing a Perl extension for general consumption, one should expect that @@ -221,6 +223,8 @@ =head2 EXAMPLE 1 +(例 1) + =begin original Our first extension will be very simple. When we call the routine in the @@ -470,6 +474,8 @@ =head2 EXAMPLE 2 +(例 2) + =begin original Now let's add to our extension a subroutine that will take a single numeric @@ -798,6 +804,8 @@ =head2 EXAMPLE 3 +(例 3) + =begin original Our third extension will take one argument as its input, round off that @@ -971,6 +979,8 @@ =head2 The XSUBPP Program +(XSUBPP プログラム) + =begin original The B<xsubpp> program takes the XS code in the .xs file and translates it into @@ -985,6 +995,8 @@ =head2 The TYPEMAP file +(TYPEMAP ファイル) + =begin original The B<xsubpp> program uses rules to convert from Perl's data types (scalar, @@ -1096,6 +1108,8 @@ =head2 EXAMPLE 4 +(例 4) + =begin original In this example, we'll now begin to write XSUBs that will interact with @@ -1390,6 +1404,8 @@ =head2 What has happened here? +(ここで何が起きているの?) + =begin original Unlike previous examples, we've now run h2xs on a real include file. This @@ -1741,6 +1757,8 @@ =head2 More about XSUB arguments +(さらに XSUB 引数について) + =begin original With the completion of Example 4, we now have an easy way to simulate some @@ -1903,6 +1921,8 @@ =head2 The Argument Stack +(引数スタック) + =begin original If we look at any of the C code generated by any of the examples except @@ -1974,10 +1994,10 @@ =end original -XSUBs are also allowed to return lists, not just scalars. This must be -done by manipulating stack values ST(0), ST(1), etc, in a subtly -different way. See L<perlxs> for details. -(TBT) +XSUB は単なるスカラではなく、リストを返すこともできます。 +これはスタック値 ST(0), ST(1) などを微妙に違う方法で操作することによって +行う必要があります。 +詳しくは L<perlxs> を参照してください。 =begin original @@ -2017,6 +2037,8 @@ =head2 Extending your Extension +(エクステンションを拡張する) + =begin original Sometimes you might want to provide some extra methods or subroutines @@ -2041,6 +2063,8 @@ =head2 Documenting your Extension +(エクステンションを文書化する) + =begin original There is absolutely no excuse for not documenting your extension. @@ -2083,6 +2107,8 @@ =head2 Installing your Extension +(エクステンションをインストールする) + =begin original Once your extension is complete and passes all its tests, installing it @@ -2120,6 +2146,8 @@ =head2 EXAMPLE 5 +(例 5) + =begin original In this example, we'll do some more work with the argument stack. The @@ -2212,6 +2240,8 @@ =head2 New Things in this Example +(この例での新しいこと) + =begin original This example added quite a few new concepts. We'll take them one at a time. @@ -2378,6 +2408,8 @@ =head2 EXAMPLE 6 +(例 6) + =begin original In this example, we will accept a reference to an array as an input @@ -2477,6 +2509,8 @@ =head2 New Things in this Example +(この例での新しいこと) + =begin original There are a number of new concepts introduced here, described below: