argra****@users*****
argra****@users*****
2010年 9月 26日 (日) 05:02:31 JST
Index: docs/perl/5.10.0/perlopentut.pod diff -u docs/perl/5.10.0/perlopentut.pod:1.6 docs/perl/5.10.0/perlopentut.pod:1.7 --- docs/perl/5.10.0/perlopentut.pod:1.6 Sat Jul 24 04:48:34 2010 +++ docs/perl/5.10.0/perlopentut.pod Sun Sep 26 05:02:30 2010 @@ -315,8 +315,8 @@ =end original -先頭の文字がパイプ記号の場合、C<open> は starts up a new -command and opens a write-only filehandle leading into that command. +先頭の文字がパイプ記号の場合、C<open> は新しいコマンドを準備して、 +そのコマンドへと導かれる書き込み専用のファイルハンドルを開きます。 This lets you write into that handle and have what you write show up on that command's standard input. 例えば: @@ -335,11 +335,11 @@ =end original -末尾の文字がパイプの場合、you start up a new command and open a -read-only filehandle leading out of that command. This lets whatever that -command writes to its standard output show up on your handle for reading. +末尾の文字がパイプの場合、新しいコマンドを準備して、 +そのコマンドから導かれる読み込み専用のファイルハンドルを開きます。 +これにより、そのコマンドが標準出力にしたものはなんでも読み込み用の +ファイルハンドルに現れます。 例えば: -(TBT) open(NET, "netstat -i -n |") || die "can't fork netstat: $!"; while (<NET>) { } # do something with input @@ -360,17 +360,19 @@ =end original -What happens if you try to open a pipe to or from a non-existent -command? If possible, Perl will detect the failure and set C<$!> as -usual. But if the command contains special shell characters, such as -C<E<gt>> or C<*>, called 'metacharacters', Perl does not execute the -command directly. Instead, Perl runs the shell, which then tries to -run the command. This means that it's the shell that gets the error -indication. In such a case, the C<open> call will only indicate -failure if Perl can't even run the shell. See L<perlfaq8/"How can I -capture STDERR from an external command?"> to see how to cope with -this. There's also an explanation in L<perlipc>. -(TBT) +存在しないコマンドに対してパイプを開こうとすると何が起こるでしょうか? +可能なら、Perl は失敗を検出していつも通り C<$!> をセットします。 +しかし、もしコマンドに「メタ文字」と呼ばれる C<E<gt>> や C<*> のような +特殊シェル文字が含まれていると、Perl はコマンドを直接実行しません。 +その代わりに、Perl はシェルを実行し、それからコマンドを +実行しようとします。 +これは、エラーを受け取るのはシェルであることを意味します。 +このような場合、C<open> 呼び出しは、たとえ Perl がシェルを実行できなかった +場合でも、失敗を示すだけです。 +これを扱う方法については、 +L<perlfaq8/"How can I capture STDERR from an external command?"> を +参照してください。 +L<perlipc> にも説明があります。 =begin original @@ -512,8 +514,8 @@ =end original This is a short cut for some renaming games that are really -the best way to update textfiles. See the second question in -L<perlfaq5> for more details. +the best way to update textfiles. +さらなる詳細については L<perlfaq5> の 2 番目の質問を参照してください。 (TBT) =head2 Filters @@ -529,11 +531,11 @@ =end original -One of the most common uses for C<open> is one you never -even notice. When you process the ARGV filehandle using -C<< <ARGV> >>, Perl actually does an implicit open -on each file in @ARGV. Thus a program called like this: -(TBT) +C<open> のもっとも一般的な使い方の一つは、使っていることを +気づきすらしないものです。 +ARGV ファイルハンドルを C<< <ARGV> >> を使って処理するとき、Perl は +実際は @ARGV の各ファイルを暗黙の内に開いています。 +従って、以下のようなプログラムは: $ myprogram file1 file2 file3 @@ -544,9 +546,8 @@ =end original -can have all its files opened and processed one at a time -using a construct no more complex than: -(TBT) +以下のようなものより複雑な構文を使わなくても、それぞれのファイルを +開いて一度に処理できます: while (<>) { # do something with $_ @@ -561,11 +562,10 @@ =end original -If @ARGV is empty when the loop first begins, Perl pretends you've opened -up minus, that is, the standard input. In fact, $ARGV, the currently -open file during C<< <ARGV> >> processing, is even set to "-" -in these circumstances. -(TBT) +ループが最初に開始したときに @ARGV が空なら、Perl はマイナス記号 +(つまり標準入力) を開いたかのように振る舞います。 +実際、C<< <ARGV> >> で現在開いているファイルを示す $ARGV には、 +この慣習によって "-" がセットされます。 =begin original @@ -576,12 +576,11 @@ =end original -You are welcome to pre-process your @ARGV before starting the loop to -make sure it's to your liking. One reason to do this might be to remove -command options beginning with a minus. +好みの形にするために、ループの開始前に @ARGV を前処理しても問題ありません。 +こうするための理由の一つは、マイナスから始まるコマンドオプションを +削除するためです。 いつでも自分で単純なものを作ることができる一方、 Getopts モジュールはこれを行うのによいものです: -(TBT) use Getopt::Std; @@ -649,11 +648,10 @@ =end original -Remember that a normal C<open> has special properties, in that it might -call fopen(3S) or it might called popen(3S), depending on what its -argument looks like; that's why it's sometimes called "magic open". -Here's an example: -(TBT) +通常の C<open> は特別な特性を持っていて、引数が何に見えるかによって、 +fopen(3S) を呼ぶかもしれませんし、popen(3S) を呼ぶかもしれません; +これが時々「マジカルに開く」と呼ばれる理由です。 +以下は例です: $pwdinfo = `domainname` =~ /^(\(none\))?$/ ? '< /etc/passwd' @@ -670,10 +668,9 @@ =end original -This sort of thing also comes into play in filter processing. Because -C<< <ARGV> >> processing employs the normal, shell-style Perl C<open>, -it respects all the special things we've already seen: -(TBT) +このようなことはフィルタ処理でも起こります。 +C<< <ARGV> >> 処理は通常のシェル風の Perl C<open> を用いるので、 +今までに見てきた全ての特別なことが反映されます: $ myprogram f1 "cmd1|" - f2 "cmd2|" f3 < tmpfile @@ -685,10 +682,9 @@ =end original -That program will read from the file F<f1>, the process F<cmd1>, standard -input (F<tmpfile> in this case), the F<f2> file, the F<cmd2> command, -and finally the F<f3> file. -(TBT) +このプログラムはファイル F<f1>、プロセス F<cmd1>、標準入力 +(この場合は F<tmpfile>)、ファイル F<f2>、コマンド F<cmd2>、 +ファイル F<f3> から読み込みます。 =begin original @@ -699,11 +695,10 @@ =end original -Yes, this also means that if you have files named "-" (and so on) in -your directory, they won't be processed as literal files by C<open>. -You'll need to pass them as "./-", much as you would for the I<rm> program, -or you could use C<sysopen> as described below. -(TBT) +はい、これは、"-" (あるいは同じような) 名前を持つファイルがある場合、 +C<open> によってそのまま処理することができないことも意味します。 +I<rm> プログラムに対して行うのと同様に "./-" という形で渡すか、後述する +C<sysopen> を使う必要があります。 =begin original @@ -727,9 +722,8 @@ =end original -Or, if you have the I<GET> program installed from LWP, -you can fetch URLs before processing them: -(TBT) +あるいは、LWP からインストールされる I<GET> プログラムがあるなら、 +処理する前に URL をフェッチできます: @ARGV = map { m#^\w+://# ? "GET $_ |" : $_ } @ARGV; @@ -740,9 +734,8 @@ =end original -It's not for nothing that this is called magic C<< <ARGV> >>. -Pretty nifty, eh? -(TBT) +これがマジカルな C<< <ARGV> >> と呼ばれるのは理由のないことではありません。 +かなりしゃれてるでしょ? =head1 Open E<agrave> la C @@ -928,9 +921,8 @@ =end original -To open a file for writing, creating a new file which must not previously -exist: -(TBT) +既に存在していたりはしない新しいファイルを作成して、ファイルを書き込み用に +開くには: sysopen(FH, $path, O_WRONLY | O_EXCL | O_CREAT); @@ -940,8 +932,7 @@ =end original -To open a file for appending, where that file must already exist: -(TBT) +既に存在している必要があるファイルを追加用に開くには: sysopen(FH, $path, O_WRONLY | O_APPEND); @@ -951,8 +942,7 @@ =end original -To open a file for update, creating a new file if necessary: -(TBT) +必要なら新しいファイルを作成して、ファイルを更新用に開くには: sysopen(FH, $path, O_RDWR | O_CREAT); @@ -962,8 +952,8 @@ =end original -To open a file for update, where that file must not already exist: -(TBT) + +予め存在していてはならないファイルを交信用に開くには: sysopen(FH, $path, O_RDWR | O_EXCL | O_CREAT); @@ -973,8 +963,7 @@ =end original -To open a file without blocking, creating one if necessary: -(TBT) +必要ならファイルを作成して、ファイルをブロックせずに開くには: sysopen(FH, $path, O_WRONLY | O_NONBLOCK | O_CREAT); @@ -990,10 +979,9 @@ =end original -If you omit the MASK argument to C<sysopen>, Perl uses the octal value -0666. The normal MASK to use for executables and directories should -be 0777, and for anything else, 0666. -(TBT) +C<sysopen> の MASK 引数を省略すると、Perl は 8 進数の 0666 を使います。 +実行ファイルとディレクトリに対する通常の MASK は 0777で、それ以外の +ファイルでは 0666 です。 =begin original @@ -1020,10 +1008,10 @@ =end original -For example, if your C<umask> were 027, then the 020 part would -disable the group from writing, and the 007 part would disable others -from reading, writing, or executing. Under these conditions, passing -C<sysopen> 0666 would create a file with mode 0640, since C<0666 & ~027> +例えば、C<umask> が 027 の場合、020 の部分はグループによる書き込みと +実行を無効にし、007 の部分は他のユーザーによる読み込み、書き込み、 +実行を無効にします。 +この条件では、C<sysopen> に 0666 を渡すとwould create a file with mode 0640, since C<0666 & ~027> is 0640. (TBT) @@ -1769,9 +1757,8 @@ =end original -Another option is to use the C<binmode> function on the appropriate -handles before doing regular I/O on them: -(TBT) +もう一つの選択肢は、通常の I/O を行う前に、適切なファイルハンドルに +C<binmode> 関数を使うことです: binmode(STDIN); binmode(STDOUT); @@ -1786,8 +1773,9 @@ =end original Passing C<sysopen> a non-standard flag option will also open the file in -binary mode on those systems that support it. This is the equivalent of -opening the file normally, then calling C<binmode> on the handle. +binary mode on those systems that support it. +これは、ファイルを普通に開いてから、ハンドルに対して C<binmode> を +呼び出すのと等価です。 (TBT) sysopen(BINDAT, "records.data", O_RDWR | O_BINARY) @@ -1816,7 +1804,7 @@ =end original -On systems with exotic I/O systems, it turns out that, astonishingly +風変わりな I/O システムを持つシステムでは、it turns out that, astonishingly enough, even unbuffered I/O using C<sysread> and C<syswrite> might do sneaky data mutilation behind your back. (TBT) @@ -1985,9 +1973,8 @@ (典型的には書き込みのために) 排他ロックを得るためには、慎重になる 必要があります。 -We C<sysopen> the file so it can be locked before it gets -emptied. You can get a nonblocking version using C<LOCK_EX | LOCK_NB>. -(TBT) +空なる前にロックするために、ファイルを C<sysopen> で開きます。 +C<LOCK_EX | LOCK_NB> を使った非ブロック版も得られます。 use 5.004; use Fcntl qw(:DEFAULT :flock); @@ -2007,7 +1994,7 @@ =end original -Finally, due to the uncounted millions who cannot be dissuaded from +最後に、due to the uncounted millions who cannot be dissuaded from wasting cycles on useless vanity devices called hit counters, here's how to increment a number in a file safely: (TBT) @@ -2056,9 +2043,9 @@ but PerlIO also brought in some new features such as the ability to think of I/O as "layers". One I/O layer may in addition to just moving the data also do -transformations on the data. Such transformations may include -compression and decompression, encryption and decryption, and transforming -between various character encodings. +transformations on the data. +このような変換には、圧縮と展開、暗号化と複合化、様々な文字エンコーディング間の +変換を含むかも知れません。 (TBT) =begin original