argra****@users*****
argra****@users*****
2011年 4月 30日 (土) 21:11:07 JST
Index: docs/perl/5.10.0/perlopentut.pod diff -u docs/perl/5.10.0/perlopentut.pod:1.9 docs/perl/5.10.0/perlopentut.pod:1.10 --- docs/perl/5.10.0/perlopentut.pod:1.9 Mon Apr 4 16:14:26 2011 +++ docs/perl/5.10.0/perlopentut.pod Sat Apr 30 21:11:07 2011 @@ -142,10 +142,9 @@ =end original -Note also that the first example uses the C<||> logical operator, and the -second uses C<or>, which has lower precedence. +最初の例は C<||> 論理演算子を使っていて、二つめの例はより優先順位の低い +C<or> を使っていることにも注意してください。 後者の例で C<||> を使うと、実際には以下のような意味になり -(TBT) open INFO, ( "< datafile" || die "can't open datafile: $!" ); @@ -415,12 +414,12 @@ =end original -If minus can be used as the default input or default output, what happens -if you open a pipe into or out of minus? What's the default command it -would run? The same script as you're currently running! +マイナスがデフォルトの入力やデフォルトの出力として使えるとすると、 +パイプに対してマイナスを使うとどうなるでしょう? +デフォルトのコマンドとして何が実行されるのでしょう? +今実行している同じスクリプトです! これは実際には C<open> 呼び出し内で隠れた C<fork> が行われます。 詳しくは L<perlipc/"Safe Pipe Opens"> を参照してください。 -(TBT) =head2 Mixing Reads and Writes @@ -440,13 +439,12 @@ 読み書きアクセス双方を指定することは可能です。 必要なことはリダイレクトの前に "+" の文字を加えるだけです。 -But as in the shell, -using a less-than on a file never creates a new file; it only opens an -existing one. On the other hand, using a greater-than always clobbers -(truncates to zero length) an existing file, or creates a brand-new one -if there isn't an old one. Adding a "+" for read-write doesn't affect -whether it only works on existing files or always clobbers existing ones. -(TBT) +しかしシェルの場合と同様、ファイルに小なり記号を使っても新しいファイルが +作成されることはありません; すでにあるファイルを開くだけです。 +一方、大なり記号を使うと、ファイルがある場合には常に上書き +(長さ 0 に切り詰め)られ、ファイルがない場合は新しいファイルが作成されます。 +読み書き用に "+" を追加しても、既にあるファイルにだけ動作するか +既にあるファイルを上書きするかということには影響を与えません。 open(WTMP, "+< /usr/adm/wtmp") || die "can't open /usr/adm/wtmp: $!"; @@ -475,12 +473,10 @@ 三つ目のものは必要があれば新しいファイルを作りますが、古いファイルを 上書きせず、ファイルのどの地点でも読み込むことができますが、 書き込みは常に末尾に行われます。 -In short, -the first case is substantially more common than the second and third -cases, which are almost always wrong. (If you know C, the plus in -Perl's C<open> is historically derived from the one in C's fopen(3S), -which it ultimately calls.) -(TBT) +要するに、一つ目のものは(ほとんど常に間違っている)二つ目や三つ目の +ものよりもかなり一般的です。 +(もし C を知っているなら、Perl の C<open> で使われるプラス記号が +歴史的には (最終的に呼ばれることになる) C の fopen(3S) に由来しています。) =begin original @@ -496,8 +492,9 @@ 実際、when it comes to updating a file, unless you're working on a binary file as in the WTMP case above, you probably don't want to -use this approach for updating. Instead, Perl's B<-i> flag comes to -the rescue. The following command takes all the C, C++, or yacc source +use this approach for updating. +代わりに、Perl の B<-i> フラグが助けになります。 +The following command takes all the C, C++, or yacc source or header files and changes all their foo's to bar's, leaving the old version in the original filename with a ".orig" tacked on the end: @@ -751,13 +748,11 @@ =end original -If you want the convenience of the shell, then Perl's C<open> is -definitely the way to go. On the other hand, if you want finer precision -than C's simplistic fopen(3S) provides you should look to Perl's -C<sysopen>, which is a direct hook into the open(2) system call. -That does mean it's a bit more involved, but that's the price of -precision. -(TBT) +シェルの便利さを求めているなら、Perl の C<open> はまさにぴったりです。 +一方、C の単純な fopen(3S) が提供しているものより高い精度を求めているなら、 +open(2) システムコールへの直接的なフックである、Perl の +C<sysopen> を見るべきです。 +これはもう少し深く関わることを意味しますが、これは精度のコストです。 =begin original @@ -782,15 +777,15 @@ =end original -The HANDLE argument is a filehandle just as with C<open>. The PATH is -a literal path, one that doesn't pay attention to any greater-thans or -less-thans or pipes or minuses, nor ignore whitespace. If it's there, -it's part of the path. The FLAGS argument contains one or more values -derived from the Fcntl module that have been or'd together using the -bitwise "|" operator. The final argument, the MASK, is optional; if -present, it is combined with the user's current umask for the creation -mode of the file. You should usually omit this. -(TBT) +HANDLE 引数は C<open> と同様のファイルハンドルです。 +PATH はリテラルなパスで、大なりや小なりやパイプやマイナスや空白の +無視といったことに一切注意を払いません。 +もしこれらの文字があれば、それはパスの一部です。 +FLAGS 引数は、ビット単位 "|" 演算子で結合できる、Fcntl モジュールに +由来する一つ以上の値を指定します。 +最後の引数である MASK はオプションです; もしあれば、これは +ファイルの作成モードのためのユーザーの現在の umask と組み合わされます。 +普通はこれは省略するべきです。 =begin original @@ -801,11 +796,11 @@ =end original -Although the traditional values of read-only, write-only, and read-write -are 0, 1, and 2 respectively, this is known not to hold true on some -systems. Instead, it's best to load in the appropriate constants first -from the Fcntl module, which supplies the following standard flags: -(TBT) +読み込み専用、書き込み専用、読み書きを示す伝統的な値は +それぞれ 0, 1, 2 ですが、これが正しくないシステムもあることが +知られています。 +代わりに、以下の標準フラグを提供している Fcntl モジュールから +最初に適切な定数を読み込むのが最善です: O_RDONLY Read only O_WRONLY Write only @@ -908,10 +903,8 @@ =end original -And here are things you can do with C<sysopen> that you cannot do with -a regular C<open>. As you'll see, it's just a matter of controlling the -flags in the third argument. -(TBT) +そしてここでは普通の C<open> では出来ないことを C<sysopen> でしています。 +見てきたように、これは単に 3 番目の引数のフラグの制御の問題です。 =begin original @@ -991,11 +984,11 @@ =end original -Why so permissive? Well, it isn't really. The MASK will be modified -by your process's current C<umask>. A umask is a number representing -I<disabled> permissions bits; that is, bits that will not be turned on -in the created files' permissions field. -(TBT) +なぜそんなに権限を与えるのでしょう? +えっと、実際にはそうではありません。 +MASK はプロセスの現在の C<umask> で修正されます。 +umask は I<無効にする> 許可ビットを表現する数値です; つまり、 +作成したファイルの許可フィールドを有効にすることはないということです。 =begin original @@ -1010,9 +1003,8 @@ 例えば、C<umask> が 027 の場合、020 の部分はグループによる書き込みと 実行を無効にし、007 の部分は他のユーザーによる読み込み、書き込み、 実行を無効にします。 -この条件では、C<sysopen> に 0666 を渡すとwould create a file with mode 0640, since C<0666 & ~027> -is 0640. -(TBT) +この条件では、C<sysopen> に 0666 を渡すとモード 0640 でファイルを作ります; +C<0666 & ~027> は 0640 だからです。 =begin original @@ -1052,15 +1044,15 @@ =end original -Sometimes you already have a filehandle open, and want to make another -handle that's a duplicate of the first one. In the shell, we place an -ampersand in front of a file descriptor number when doing redirections. -For example, C<< 2>&1 >> makes descriptor 2 (that's STDERR in Perl) -be redirected into descriptor 1 (which is usually Perl's STDOUT). -The same is essentially true in Perl: a filename that begins with an -ampersand is treated instead as a file descriptor if a number, or as a -filehandle if a string. -(TBT) +既に開いているファイルハンドルを持っている時に、これを複製して +もう一つのハンドルがほしくなる場合がときどきあります。 +シェルでは、リダイレクトをするときにファイル記述子番号の前に +アンパサンドを置きます。 +例えば C<< 2>&1 >> は、記述子 2 (これは Perl では STDERR) を +記述子 1 (これは Perl では普通は STDOUT) にリダイレクトします。 +同じことは Perl でも基本的には真です: アンパサンドで始まるファイル名は、 +それが数値ならファイル記述子、文字列ならファイルハンドルとして +扱われます。 open(SAVEOUT, ">&SAVEERR") || die "couldn't dup SAVEERR: $!"; open(MHCONTEXT, "<&4") || die "couldn't dup fd4: $!"; @@ -1075,12 +1067,11 @@ =end original -That means that if a function is expecting a filename, but you don't -want to give it a filename because you already have the file open, you -can just pass the filehandle with a leading ampersand. It's best to -use a fully qualified handle though, just in case the function happens -to be in a different package: -(TBT) +これは、もし関数がファイル名を想定しているけれども、既にファイルは +開いているのでファイル名を渡したくない場合、単に先頭にアンパサンドを +付けたファイルハンドルを渡せるということを意味します。 +しかし、万が一関数がたまたま違うパッケージだったときのために、完全修飾した +ハンドルを渡すのが最善です: somefunction("&main::LOGFILE"); @@ -1093,11 +1084,11 @@ =end original -This way if somefunction() is planning on opening its argument, it can -just use the already opened handle. This differs from passing a handle, -because with a handle, you don't open the file. Here you have something -you can pass to open. -(TBT) +この方法により、somefunction() が引数の値を開いた場合、 +単に既に開いているハンドルを使えます。 +これはハンドルを渡すのとは違います; なぜならハンドルではファイルを +開かないからです。 +こちらでは開くときに指定できるものが指定できます。 =begin original @@ -1166,7 +1157,7 @@ =end original -If you're using magic C<< <ARGV> >>, you could even pass in as a +もしマジカルな C<< <ARGV> >> を使っているなら、you could even pass in as a command line argument in @ARGV something like C<"<&=$MHCONTEXTFD">, but we've never seen anyone actually do this. (TBT) @@ -1207,12 +1198,12 @@ もしマジカルな C<open> があなたにとってちょっとマジカルすぎるとしても、 C<sysopen> にまで戻る必要はありません。 -To open a file with arbitrary weird characters in -it, it's necessary to protect any leading and trailing whitespace. -Leading whitespace is protected by inserting a C<"./"> in front of a -filename that starts with whitespace. Trailing whitespace is protected -by appending an ASCII NUL byte (C<"\0">) at the end of the string. -(TBT) +ファイル名にどんな変な文字が含まれているファイルでも開くためには、 +先頭と末尾の空白を保護する必要があります。 +先頭の空白は、空白で始まるファイル名の前に C<"./"> を挿入することで +保護します。 +末尾の空白は、文字列の末尾に ASCII NUL バイト (C<"\0">) を +追加することで保護します。 $file =~ s#^(\s)#./$1#; open(FH, "< $file\0") || die "can't open $file: $!"; @@ -1229,14 +1220,16 @@ =end original -This assumes, of course, that your system considers dot the current -working directory, slash the directory separator, and disallows ASCII -NULs within a valid filename. Most systems follow these conventions, -including all POSIX systems as well as proprietary Microsoft systems. -The only vaguely popular system that doesn't work this way is the -"Classic" Macintosh system, which uses a colon where the rest of us -use a slash. Maybe C<sysopen> isn't such a bad idea after all. -(TBT) +これはもちろん、あなたのシステムが "." をカレントディレクトリ、 +"/" をディレクトリの区切りとして扱い、ASCII NUL をファイル名として +認めていないということを仮定しています。 +全ての POSIX システムとプロプリエタリの Microsoft システムを含む、 +ほとんどのシステムはこの慣例に従っています。 +これに従わない、一般的に有名な唯一のシステムは +"Classic" Macintosh システムです; これは他のシステムが "/" を +使っているところで ":" を使います。 +おそらく、とにかく C<sysopen> を使うということはそれほど悪い考えでは +ありません。 =begin original @@ -1245,9 +1238,8 @@ =end original -If you want to use C<< <ARGV> >> processing in a totally boring -and non-magical way, you could do this first: -(TBT) +もし、C<< <ARGV> >> の処理を、本当に退屈かつマジカルでない方法で +行いたいなら、まず以下のようにできます: # "Sam sat on the ground and put his head in his hands. # 'I wish I had never come here, and I don't want to see @@ -1267,12 +1259,14 @@ =end original -But be warned that users will not appreciate being unable to use "-" -to mean standard input, per the standard convention. -(TBT) +但し、ユーザーは、標準入力を意味するために "-" を使うという一般的な +慣習が使えないということを喜ばないだろうということは +警告しておきます。 =head2 Paths as Opens +(open にパスを) + =begin original You've probably noticed how Perl's C<warn> and C<die> functions can @@ -1337,12 +1331,12 @@ =end original -Remember how we said that Perl's open took two arguments? That was a -passive prevarication. You see, it can also take just one argument. -If and only if the variable is a global variable, not a lexical, you -can pass C<open> just one argument, the filehandle, and it will -get the path from the global scalar variable of the same name. -(TBT) +Perl の open は 2 引数を取ると言ったことを覚えていますか? +これは消極的なごまかしです。 +ほら、単に 1 引数を取ることもできます。 +変数がレキシカルではなくグローバルな変数の場合にのみ、C<open> に +1 引数だけ(ファイルハンドル)を渡すことができます; こうすると、 +同じ名前を持つグローバルなスカラ変数からパスを取ります。 $FILE = "/etc/motd"; open FILE or die "can't open $FILE: $!"; @@ -1358,7 +1352,8 @@ =end original -Why is this here? Someone has to cater to the hysterical porpoises. +どうしてこれはここなんでしょう? +Someone has to cater to the hysterical porpoises. It's something that's been in Perl since the very beginning, if not before. (TBT) @@ -1609,12 +1604,13 @@ =end original 名前付きパイプは別の問題です。 -You pretend they're regular files, -but their opens will normally block until there is both a reader and -a writer. You can read more about them in L<perlipc/"Named Pipes">. -Unix-domain sockets are rather different beasts as well; they're -described in L<perlipc/"Unix-Domain TCP Clients and Servers">. -(TBT) +これらは普通のファイルのように振る舞いますが、この open は普通 +読み込み側と書き込み側の両方ができるまでブロックされます。 +これらについては L<perlipc/"Named Pipes"> でより多くのことを +読むことができます。 +Unix ドメインソケットは同様にやや違うものです; +これらは L<perlipc/"Unix-Domain TCP Clients and Servers"> に +記述されています。 =begin original @@ -1627,13 +1623,14 @@ =end original -When it comes to opening devices, it can be easy and it can be tricky. -We'll assume that if you're opening up a block device, you know what -you're doing. The character devices are more interesting. These are -typically used for modems, mice, and some kinds of printers. This is -described in L<perlfaq8/"How do I read and write the serial port?"> -It's often enough to open them carefully: -(TBT) +デバイスを開くときは、簡単にもなりますしトリッキーにもなります。 +ブロックデバイスを開こうとしているなら、何をしようとしているのか +分かっていることを仮定します。 +キャラクタデバイスはもっと興味深いです。 +これらは典型的にはモデム、マウス、ある種のプリンタのために使われます。 +これは L<perlfaq8/"How do I read and write the serial port?"> に +記述されています。 +しばしば慎重に開くだけで充分です: sysopen(TTYIN, "/dev/ttyS1", O_RDWR | O_NDELAY | O_NOCTTY) # (O_NOCTTY no longer needed on POSIX systems) @@ -1653,9 +1650,8 @@ =end original -With descriptors that you haven't opened using C<sysopen>, such as -sockets, you can set them to be non-blocking using C<fcntl>: -(TBT) +ソケットのように、C<sysopen> を使わずに開いた記述子の場合は、 +C<fcntl> を使って非ブロックモードに設定できます: use Fcntl; my $old_flags = fcntl($handle, F_GETFL, 0) @@ -1679,11 +1675,13 @@ Rather than losing yourself in a morass of twisting, turning C<ioctl>s, all dissimilar, if you're going to manipulate ttys, it's best to make calls out to the stty(1) program if you have it, or else use the -portable POSIX interface. To figure this all out, you'll need to read the -termios(3) manpage, which describes the POSIX interface to tty devices, -and then L<POSIX>, which describes Perl's interface to POSIX. There are -also some high-level modules on CPAN that can help you with these games. -Check out Term::ReadKey and Term::ReadLine. +portable POSIX interface. +これらのこと全てを理解するには、まず tty デバイスへの POSIX +インターフェースについて記述している termios(3) man ページを読んで、次に +POSIX への Perl のインターフェースについて記述している L<POSIX> を +読む必要があります。 +これらのものを扱う助けになるような高レベルモジュールも CPAN にあります。 +Term::ReadKey と Term::ReadLine を調べてください。 (TBT) =head2 Opening Sockets @@ -1774,11 +1772,10 @@ =end original -Passing C<sysopen> a non-standard flag option will also open the file in -binary mode on those systems that support it. +C<sysopen> に非標準フラグオプションを渡すことでも、そのような +システムでバイナリモードでファイルを開けます。 これは、ファイルを普通に開いてから、ハンドルに対して C<binmode> を 呼び出すのと等価です。 -(TBT) sysopen(BINDAT, "records.data", O_RDWR | O_BINARY) || die "can't open records.data: $!"; @@ -1792,11 +1789,10 @@ =end original -Now you can use C<read> and C<print> on that handle without worrying -about the non-standard system I/O library breaking your data. It's not -a pretty picture, but then, legacy systems seldom are. CP/M will be -with us until the end of days, and after. -(TBT) +これで、非標準システム I/O ライブラリがデータを壊す心配なしに +ハンドルに対して C<read> と C<print> を使えるようになりました。 +これは美しい形ではありませんが、レガシーシステムとは大抵そういうものです。 +CP/M は世界が終わるまで(そしてその後も)我々と共にあるでしょう。 =begin original @@ -1823,10 +1819,10 @@ =end original -Depending on the vicissitudes of your runtime system, even these calls -may need C<binmode> or C<O_BINARY> first. Systems known to be free of -such difficulties include Unix, the Mac OS, Plan 9, and Inferno. -(TBT) +実行させるシステムの紆余曲折具合によっては、これらのシステムコールですら +最初に C<binmode> や C<O_BINARY> が必要かもしれません。 +このような問題がないと分かっているシステムには Unix, Mac OS, Plan 9, +Inferno などがあります。 =head2 File Locking