perlopentut > 5.12.1 との差分

perlopentut 5.12.1 と 5.36.0 の差分

11
2=encoding euc-jp
2=encoding utf8
33
44=head1 NAME
55
66=begin original
77
8perlopentut - tutorial on opening things in Perl
8perlopentut - simple recipes for opening files and pipes in Perl
99
1010=end original
1111
12perlopentut - Perl でいろんなものを開ためのチュートリアル
12perlopentut - Perl でファイルを開りパイプを使ったりするための簡単なレシピ
1313
1414=head1 DESCRIPTION
1515
1616=begin original
1717
18Perl has two simple, built-in ways to open files: the shell way for
18Whenever you do I/O on a file in Perl, you do so through what in Perl is
19convenience, and the C way for precision. The shell way also has 2- and
19called a B<filehandle>. A filehandle is an internal name for an external
203-argument forms, which have different semantics for handling the filename.
20file. It is the job of the C<open> function to make the association
21The choice is yours.
21between the internal name and the external name, and it is the job
22of the C<close> function to break that association.
2223
2324=end original
2425
25Perl には、ファイルを開くための 2 つの単純な組み込みの手段があります:
26Perl ファイルに対して入出力するとき、Perl では B<ファイルハンドル> と
26利便性ためのシェル風の方法と、正確性のための C 風の方法です。
27呼ばれるもを通して行います。
27シェ風の方法に 2 引数と 3 引数があり、ファイル名の扱い関して
28ファイハンドル外部ファイルに対する内部名です。
28異なった動作します。
29C<open> 関数の仕事は内部名と外部名関連づけることで、C<close> 関数は
29選択はあなた次第です。
30関連づけを壊すことです。
3031
31=head1 Open E<agrave> la shell
32
33(シェル風に開く)
34
3532=begin original
3633
37Perl's C<open> function was designed to mimic the way command-line
34For your convenience, Perl sets up a few special filehandles that are
38redirection in the shell works. Here are some basic examples
35already open when you run. These include C<STDIN>, C<STDOUT>, C<STDERR>,
39from the shell:
36and C<ARGV>. Since those are pre-opened, you can use them right away
37without having to go to the trouble of opening them yourself:
4038
4139=end original
4240
43Perl の C<open> 関数、シェルでのコマンドラインのリダイレクトをまね
41便利なように、Perl は実行開始時に既に開いいるいくつかの特別な
44計されています。
42ファイルハンドルを定します。
45以下シェルの基本的な例で:
43それ C<STDIN>, C<STDOUT>, C<STDERR>, C<ARGV> です
44これらは既に開いているので、自分でこれらを開くときの問題を受けることなく
45正しく使うことができます。
4646
47 $ myprogram file1 file2 file3
47 print STDERR "This is a debugging message.\n";
48 $ myprogram < inputfile
49 $ myprogram > outputfile
50 $ myprogram >> outputfile
51 $ myprogram | otherprogram
52 $ otherprogram | myprogram
5348
54=begin original
49 print STDOUT "Please enter something: ";
50 $response = <STDIN> // die "how come no input?";
51 print STDOUT "Thank you!\n";
5552
56And here are some more advanced examples:
53 while (<ARGV>) { ... }
5754
58=end original
59
60そして以下はもう少し高度な例です:
61
62 $ otherprogram | myprogram f1 - f2
63 $ otherprogram 2>&1 | myprogram -
64 $ myprogram <&3
65 $ myprogram >&4
66
6755=begin original
6856
69Programmers accustomed to constructs like those above can take comfort
57As you see from those examples, C<STDOUT> and C<STDERR> are output
70in learning that Perl directly supports these familiar constructs using
58handles, and C<STDIN> and C<ARGV> are input handles. They are
71virtually the same syntax as the shell.
59in all capital letters because they are reserved to Perl, much
60like the C<@ARGV> array and the C<%ENV> hash are. Their external
61associations were set up by your shell.
7262
7363=end original
7464
75上述のような方法慣れているプログラマにとってはPerl がシェル事実上
65これら例で見られるように、C<STDOUT> C<STDERR> は出力ハンドルで、
76同じ文法を使った親しんでいる構造に直接対応していることは
66C<STDIN> C<ARGV> 入力ハンドルです。
77学ぶのが容易なります。
67これらは C<@ARGV> 配列や C<%ENV> ハッシュと同様 Perl によって
68予約されているので、全て大文字になっています。
69これらの外部関連づけはシェルによって行われます。
7870
79=head2 Simple Opens
80
81(単純に開く)
82
8371=begin original
8472
85The C<open> function takes two arguments: the first is a filehandle,
73You will need to open every other filehandle on your own. Although there
86and the second is a single string comprising both what to open and how
74are many variants, the most common way to call Perl's open() function
87to open it. C<open> returns true when it works, and when it fails,
75is with three arguments and one return value:
88returns a false value and sets the special variable C<$!> to reflect
89the system error. If the filehandle was previously opened, it will
90be implicitly closed first.
9176
9277=end original
9378
94C<open> 関数は 2 つ引数を取ります: 1 つめはファイルハンドルで
79他のファイルハンドルは自分開く必要があります。
952 つめを開くかとどう開くかで構成される単の文字列です。
80多くのバリエーションありますが、Perl の open() 関数を開く最も般的な方法は
96C<open> は成功する真をし、失敗ると偽を返して特殊変数 C<$!> に
813 引数一つのり値のもので:
97システムエラーを反映します。
98指定されたファイルハンドルが以前に開かれていた場合は、暗黙の内に
99まず閉じられます。
10082
10183=begin original
10284
103For example:
85C< I<OK> = open(I<HANDLE>, I<MODE>, I<PATHNAME>)>
10486
10587=end original
10688
107例えば:
89C< I<OK> = open(I<HANDLE>, I<MODE>, I<PATHNAME>)>
10890
109 open(INFO, "datafile") || die("can't open datafile: $!");
110 open(INFO, "< datafile") || die("can't open datafile: $!");
111 open(RESULTS,"> runstats") || die("can't open runstats: $!");
112 open(LOG, ">> logfile ") || die("can't open logfile: $!");
113
11491=begin original
11592
116If you prefer the low-punctuation version, you could write that this way:
93Where:
11794
11895=end original
11996
120句読点が少ない方が好みなら、以下のようにも書けます:
97ここで:
12198
122 open INFO, "< datafile" or die "can't open datafile: $!";
99=over
123 open RESULTS,"> runstats" or die "can't open runstats: $!";
124 open LOG, ">> logfile " or die "can't open logfile: $!";
125100
126=begin original
101=item I<OK>
127102
128A few things to notice. First, the leading less-than is optional.
129If omitted, Perl assumes that you want to open the file for reading.
130
131=end original
132
133いくつか気がつくことがあります。
134まず、先頭の「大なり」は省略可能です。
135省略されると、Perl はファイルを読み込みのために開きたいと仮定します。
136
137103=begin original
138104
139Note also that the first example uses the C<||> logical operator, and the
105will be some defined value if the open succeeds, but
140second uses C<or>, which has lower precedence. Using C<||> in the latter
106C<undef> if it fails;
141examples would effectively mean
142107
143108=end original
144109
145最初の例は C<||> 論理演算子を使っていて、二つめの例はより優先順位の低い
110これ、開くのに成功すれば何らかの定義された値、失敗すれば C<undef> です;
146C<or> を使っていることにも注意してください。
147後者の例で C<||> を使うと、実際には以下のような意味になり
148111
149 open INFO, ( "< datafile" || die "can't open datafile: $!" );
112=item I<HANDLE>
150113
151114=begin original
152115
153which is definitely not what you want.
116should be an undefined scalar variable to be filled in by the
117C<open> function if it succeeds;
154118
155119=end original
156120
157あなたが望んでいるのと全く違うなりま
121れは、成功すれば C<open> 関数よって埋められる未定義のスカラ変数で;
158122
159=begin original
123=item I<MODE>
160124
161The other important thing to notice is that, just as in the shell,
162any whitespace before or after the filename is ignored. This is good,
163because you wouldn't want these to do different things:
164
165=end original
166
167他の注意するべき重要なこととしては、シェルと同様、ファイル名の前後の
168空白は無視されることです。
169これはよいことです; なぜなら、以下のものが違うことをすることは
170望まないだろうからです:
171
172 open INFO, "<datafile"
173 open INFO, "< datafile"
174 open INFO, "< datafile"
175
176125=begin original
177126
178Ignoring surrounding whitespace also helps for when you read a filename
127is the access mode and the encoding format to open the file with;
179in from a different file, and forget to trim it before opening:
180128
181129=end original
182130
183周りの空白を無視するファイルファイルから読み込ん
131はファイルを開くときアクセスモードとエンコーディング型式す;
184開く前に空白を取り除くのを忘れたときにも助けになります:
185132
186 $filename = <INFO>; # oops, \n still there
133=item I<PATHNAME>
187 open(EXTRA, "< $filename") || die "can't open $filename: $!";
188134
189135=begin original
190136
191This is not a bug, but a feature. Because C<open> mimics the shell in
137is the external name of the file you want opened.
192its style of using redirection arrows to specify how to open the file, it
193also does so with respect to extra whitespace around the filename itself
194as well. For accessing files with naughty names, see
195L<"Dispelling the Dweomer">.
196138
197139=end original
198140
199これはバグではありません、仕様です。
141これは開きたいファイルの外部名です。
200C<open> はどのようにファイルを開くかを指定するのにリダイレクトの矢印を
201使うことでシェルを真似ているので、ファイル名の周りの空白についても
202同じように扱います。
203行儀の悪い名前のファイルにアクセスするためには、
204L<"Dispelling the Dweomer"> を参照してください。
205142
206=begin original
143=back
207144
208There is also a 3-argument version of C<open>, which lets you put the
209special redirection characters into their own argument:
210
211=end original
212
213また、3 引数版の C<open> もあって、これは特殊なリダイレクト文字を
214独立した引数にしたものです:
215
216 open( INFO, ">", $datafile ) || die "Can't create $datafile: $!";
217
218145=begin original
219146
220In this case, the filename to open is the actual string in C<$datafile>,
147Most of the complexity of the C<open> function lies in the many
221so you don't have to worry about C<$datafile> containing characters
148possible values that the I<MODE> parameter can take on.
222that might influence the open mode, or whitespace at the beginning of
223the filename that would be absorbed in the 2-argument version. Also,
224any reduction of unnecessary string interpolation is a good thing.
225149
226150=end original
227151
228この場合、開くファイル名は C<$datafile> の実際文字列なので
152C<open> 関数複雑さ大部分はI<MODE> 引数が多くの値を
229C<$datafile> に開くモードに影響を与え文字や、
153ことのできることにあります。
2302 引数版では吸収されるファイル名の先頭の空白が含まれているかどうかを
231心配する必要はありません。
232また、不必要な文字列変換が削減されるのもよいことです。
233154
234=head2 Indirect Filehandles
235
236(間接ファイルハンドル)
237
238155=begin original
239156
240C<open>'s first argument can be a reference to a filehandle. As of
157One last thing before we show you how to open files: opening
241perl 5.6.0, if the argument is uninitialized, Perl will automatically
158files does not (usually) automatically lock them in Perl. See
242create a filehandle and put a reference to it in the first argument,
159L<perlfaq5> for how to lock.
243like so:
244160
245161=end original
246162
247C<open> の最初の引数は、ファイルハンドルへリファレンスにすること出来ます。
163ファイルの開き方を説明する前に最後に一言: Perl ではファイルを開いて
248perl 5.6.0 以降、引数が初期化されていない場合、Perl
164(普通)自動的にロックすることはしません。
249以下よう、自動的にファイルハンドル作成して、それへのリファレンスを
165ロック方法ついては L<perlfaq5> 参照してください。
250最初の引数に設定します:
251166
252 open( my $in, $infile ) or die "Couldn't read $infile: $!";
167=head1 Opening Text Files
253 while ( <$in> ) {
254 # do something with $_
255 }
256 close $in;
257168
258=begin original
169(テキストファイルを開く)
259170
260Indirect filehandles make namespace management easier. Since filehandles
171=head2 Opening Text Files for Reading
261are global to the current package, two subroutines trying to open
262C<INFILE> will clash. With two functions opening indirect filehandles
263like C<my $infile>, there's no clash and no need to worry about future
264conflicts.
265172
266=end original
173(読み込み用にテキストファイルを開く)
267174
268間接ファイルハンドルは、名前空間管理をより容易にします。
269ファイルハンドルは現在のパッケージに対してグローバルなので、
270二つのサブルーチンが C<INFILE> を開こうとすると衝突します。
271二つの関数が C<my $infil> のように間接ファイルハンドルで開いていると、
272衝突は発生せず、将来の衝突を気にする必要もありません。
273
274175=begin original
275176
276Another convenient behavior is that an indirect filehandle automatically
177If you want to read from a text file, first open it in
277closes when it goes out of scope or when you undefine it:
178read-only mode like this:
278179
279180=end original
280181
281もう一つの便利は振る舞いとして、間接ファイルハンドルはスコープ外出るか
182テキストファイルを読み込みたい場合まず次のよう読み込み専用モードで
282undef にされると、自動的に閉じます:
183開きます:
283184
284 sub firstline {
185 my $filename = "/some/path/to/a/textfile/goes/here";
285 open( my $in, shift ) && return scalar <$in>;
186 my $encoding = ":encoding(UTF-8)";
286 # no close() required
187 my $handle = undef; # this will be filled in on success
287 }
288188
289=head2 Pipe Opens
189 open($handle, "< $encoding", $filename)
190 || die "$0: can't open $filename for reading: $!";
290191
291(パイプを開く)
292
293192=begin original
294193
295In C, when you want to open a file using the standard I/O library,
194As with the shell, in Perl the C<< "<" >> is used to open the file in
296you use the C<fopen> function, but when opening a pipe, you use the
195read-only mode. If it succeeds, Perl allocates a brand new filehandle for
297C<popen> function. But in the shell, you just use a different redirection
196you and fills in your previously undefined C<$handle> argument with a
298character. That's also the case for Perl. The C<open> call
197reference to that handle.
299remains the same--just its argument differs.
300198
301199=end original
302200
303C では標準 I/O ライブラリを使ってファイルを開いときは C<fopen> を
201シェルと同様にPerl でもファイルを読み込み専用モードでめに
304使いますが、パイプを開くときには C<popen> 関数を使ます。
202C<< "<" >> 使われます。
305しかしシェルで、単に違うリダレクト文字使います。
203これに成功するとPerl 新しいファルハンドル割り当て、未定義だった
306これは Perl の場合も当てはまります。
204C<$handle> 引数そのハンドルへのリファレンスを設定します。
307C<open> 呼び出しは同じままです -- 単にその引数が変わります。
308205
309206=begin original
310207
311If the leading character is a pipe symbol, C<open> starts up a new
208Now you may use functions like C<readline>, C<read>, C<getc>, and
312command and opens a write-only filehandle leading into that command.
209C<sysread> on that handle. Probably the most common input function
313This lets you write into that handle and have what you write show up on
210is the one that looks like an operator:
314that command's standard input. For example:
315211
316212=end original
317213
318先頭文字がパイプ記号の場合、C<open> は新しいコマンドを準備して、
214これでこハンドルに対して C<readline>, C<read>, C<getc>,
319コマンドへと導かれる書き込み専用のファイルハンドルを開きます。
215C<sysread> ような関数が使えます。
320これによって、あたがこハンドル書き込んだものがコマンドの
216おそらく最も一般的入力関数は演算子よう見えるものでしょう:
321標準入力に渡されるようになります。
322例えば:
323217
324 open(PRINTER, "| lpr -Plp1") || die "can't run lpr: $!";
218 $line = readline($handle);
325 print PRINTER "stuff\n";
219 $line = <$handle>; # same thing
326 close(PRINTER) || die "can't close lpr: $!";
327220
328221=begin original
329222
330If the trailing character is a pipe, you start up a new command and open a
223Because the C<readline> function returns C<undef> at end of file or
331read-only filehandle leading out of that command. This lets whatever that
224upon error, you will sometimes see it used this way:
332command writes to its standard output show up on your handle for reading.
333For example:
334225
335226=end original
336227
337末尾の文字がパ場合、新しいコマンド準備して
228C<readline> 関数はファル終端やエラーときに C<undef> 返すので
338コマンドから導かれる読み込み専用ファイルハンドル開きます。
229時々次ように使わているのを見るでしょう:
339これにより、そのコマンドが標準出力にしたものはなんでも読み込み用の
340ファイルハンドルに現れます。
341例えば:
342230
343 open(NET, "netstat -i -n |") || die "can't fork netstat: $!";
231 $line = <$handle>;
344 while (<NET>) { } # do something with input
232 if (defined $line) {
345 close(NET) || die "can't close netstat: $!";
233 # do something with $line
234 }
235 else {
236 # $line is not valid, so skip it
237 }
346238
347239=begin original
348240
349What happens if you try to open a pipe to or from a non-existent
241You can also just quickly C<die> on an undefined value this way:
350command? If possible, Perl will detect the failure and set C<$!> as
351usual. But if the command contains special shell characters, such as
352C<E<gt>> or C<*>, called 'metacharacters', Perl does not execute the
353command directly. Instead, Perl runs the shell, which then tries to
354run the command. This means that it's the shell that gets the error
355indication. In such a case, the C<open> call will only indicate
356failure if Perl can't even run the shell. See L<perlfaq8/"How can I
357capture STDERR from an external command?"> to see how to cope with
358this. There's also an explanation in L<perlipc>.
359242
360243=end original
361244
362存在ないコマンドに対してパイプを開こうとすると何が起しょうか?
245また、次のようにて単未定義値に対してすばやく C<die> することもきます:
363可能なら、Perl は失敗を検出していつも通り C<$!> をセットします。
364しかし、もしコマンドに「メタ文字」と呼ばれる C<E<gt>> や C<*> のような
365特殊シェル文字が含まれていると、Perl はコマンドを直接実行しません。
366その代わりに、Perl はシェルを実行し、それからコマンドを
367実行しようとします。
368これは、エラーを受け取るのはシェルであることを意味します。
369このような場合、C<open> 呼び出しは、たとえ Perl がシェルを実行できなかった
370場合でも、失敗を示すだけです。
371これを扱う方法については、
372L<perlfaq8/"How can I capture STDERR from an external command?"> を
373参照してください。
374L<perlipc> にも説明があります。
375246
376=begin original
247 $line = <$handle> // die "no input found";
377248
378If you would like to open a bidirectional pipe, the IPC::Open2
379library will handle this for you. Check out
380L<perlipc/"Bidirectional Communication with Another Process">
381
382=end original
383
384双方向パイプを開きたい場合は、IPC::Open2 ライブラリが使えます。
385L<perlipc/"Bidirectional Communication with Another Process"> を
386参照してください。
387
388249=begin original
389250
390perl-5.6.x introduced a version of piped open that executes a process
251However, if hitting EOF is an expected and normal event, you do not want to
391based on its command line arguments without relying on the shell. (Similar
252exit simply because you have run out of input. Instead, you probably just want
392to the C<system(@LIST)> notation.) This is safer and faster than executing
253to exit an input loop. You can then test to see if an actual error has caused
393a single argument pipe-command, but does not allow special shell
254the loop to terminate, and act accordingly:
394constructs. (It is also not supported on Microsoft Windows, Mac OS Classic
395or RISC OS.)
396255
397256=end original
398257
399perl-5.6.x シェル頼らずにコマンドライン引数を基にしプロセスを
258EOF 到達するのが想定されいて通常の出来事の場合は、
400実行するパイプオープンが導されました。
259力がなくなっただけで終了したくありません
401(C<system(@LIST)> 記法と同様)
260そうはなく、単に入力ループを終了したいでしょう
402これは 1 引数パイコマンドするより安全高速でが、特殊シェル
261実際エラーがループを終了させたのかをテストして、適切にきま:
403構文は使えません。
404(また、Microsoft Windows, Mac OS Classic, RISC OS でも対応していません。)
405262
406=begin original
263 while (<$handle>) {
264 # do something with data in $_
408Here's an example of C<open '-|'>, which prints a random Unix
409fortune cookie as uppercase:
410
411=end original
412
413以下は C<open '-|'> の例で、ランダムな Unix おみくじを大文字で表示します:
414
415 my $collection = shift(@ARGV);
416 open my $fortune, '-|', 'fortune', $collection
417 or die "Could not find fortune - $!";
418 while (<$fortune>)
419 {
420 print uc($_);
421265 }
422 close($fortune);
266 if ($!) {
267 die "unexpected error while reading from $filename: $!";
268 }
423269
424270=begin original
425271
426And this C<open '|-'> pipes into lpr:
272B<A Note on Encodings>: Having to specify the text encoding every time
273might seem a bit of a bother. To set up a default encoding for C<open> so
274that you don't have to supply it each time, you can use the C<open> pragma:
427275
428276=end original
429277
430そしてこれは C<open '|-'> パイプ lpr に送りま:
278B<エンコーディングに関する注意>: テキストエンコーディング毎回指定
279必要があるのは少し面倒に感じるかもしれません。
280毎回設定する必要がないように C<open> のためのデフォルトエンコーディングを
281設定するために、C<open> プラグマを使えます:
431282
432 open my $printer, '|-', 'lpr', '-Plp1'
283 use open qw< :encoding(UTF-8) >;
433 or die "can't run lpr: $!";
434 print {$printer} "stuff\n";
435 close($printer)
436 or die "can't close lpr: $!";
437284
438=head2 The Minus File
439
440("-" ファイル)
441
442285=begin original
443286
444Again following the lead of the standard shell utilities, Perl's
287Once you've done that, you can safely omit the encoding part of the
445C<open> function treats a file whose name is a single minus, "-", in a
288open mode:
446special way. If you open minus for reading, it really means to access
447the standard input. If you open minus for writing, it really means to
448access the standard output.
449289
450290=end original
451291
452再び標準シェルの機能に合わせるようにPerl
292一度これを行えばopen モードからエンコーディング部分を安全に省略できます:
453C<open> 関数は、名前がマイナス一つ "-" だけのファイルを特別に扱います。
454読み込み用にマイナスを開くと、実際には標準入力にアクセスします。
455書き込み用にマイナスを開くと、実際には標準出力にアクセスします。
456293
457=begin original
294 open($handle, "<", $filename)
295 || die "$0: can't open $filename for reading: $!";
458296
459If minus can be used as the default input or default output, what happens
460if you open a pipe into or out of minus? What's the default command it
461would run? The same script as you're currently running! This is actually
462a stealth C<fork> hidden inside an C<open> call. See
463L<perlipc/"Safe Pipe Opens"> for details.
464
465=end original
466
467マイナスがデフォルトの入力やデフォルトの出力として使えるとすると、
468パイプに対してマイナスを使うとどうなるでしょう?
469デフォルトのコマンドとして何が実行されるのでしょう?
470今実行している同じスクリプトです!
471これは実際には C<open> 呼び出し内で隠れた C<fork> が行われます。
472詳しくは L<perlipc/"Safe Pipe Opens"> を参照してください。
473
474=head2 Mixing Reads and Writes
475
476(読み書きを混ぜる)
477
478297=begin original
479298
480It is possible to specify both read and write access. All you do is
299But never use the bare C<< "<" >> without having set up a default encoding
481add a "+" symbol in front of the redirection. But as in the shell,
300first. Otherwise, Perl cannot know which of the many, many, many possible
482using a less-than on a file never creates a new file; it only opens an
301flavors of text file you have, and Perl will have no idea how to correctly
483existing one. On the other hand, using a greater-than always clobbers
302map the data in your file into actual characters it can work with. Other
484(truncates to zero length) an existing file, or creates a brand-new one
303common encoding formats including C<"ASCII">, C<"ISO-8859-1">,
485if there isn't an old one. Adding a "+" for read-write doesn't affect
304C<"ISO-8859-15">, C<"Windows-1252">, C<"MacRoman">, and even C<"UTF-16LE">.
486whether it only works on existing files or always clobbers existing ones.
305See L<perlunitut> for more about encodings.
487306
488307=end original
489308
490読み書きアクセス双方定することは可能です。
309しかし、先にデフォルトのエンコーディング定することなく裸の
491必要なことはリダイレクトの前に "+" の文字加えるだけ
310C<< "<" >> 使うことは決してしないください
492しかしシェルの場合と同様、ファイルに小り記号を使っても新しいファイル
311さもければ、Perl はとてもとてもとてもたくさんあるテキストファイル
493作成されることはありません; すでにあるファイルを開くだけです。
312種類のうちどかを知ることができず、Perl はあなたのファイルのデータ
494一方、大なり記号を使うと、ファイルがあ場合は常に上書
313動作させための実際の文字マッピングすることがでません。
495(長さ 0 切り詰め)られ、ファイルがない場合新しいファイルが作成されます。
314その他のよくあるエンコーディング形式には
496読み書き用に "+" を追加しても、既にあるファイルにだけ動作するか
315C<"ASCII">, C<"ISO-8859-1">,
497既にあるファイルを上書きするかということには影響を与えません。
316C<"ISO-8859-15">, C<"Windows-1252">, C<"MacRoman"> および、
317C<"UTF-16LE"> すらもあります。
318エンコーディングに関するさらなる情報については L<perlunitut> を
319参照してください。
498320
499 open(WTMP, "+< /usr/adm/wtmp")
321=head2 Opening Text Files for Writing
500 || die "can't open /usr/adm/wtmp: $!";
501322
502 open(SCREEN, "+> lkscreen")
323(書き込み用にテキストファイルを開く)
503 || die "can't open lkscreen: $!";
504324
505 open(LOGFILE, "+>> /var/log/applog")
506 || die "can't open /var/log/applog: $!";
507
508325=begin original
509326
510The first one won't create a new file, and the second one will always
327When you want to write to a file, you first have to decide what to do about
511clobber an old one. The third one will create a new file if necessary
328any existing contents of that file. You have two basic choices here: to
512and not clobber an old one, and it will allow you to read at any point
329preserve or to clobber.
513in the file, but all writes will always go to the end. In short,
514the first case is substantially more common than the second and third
515cases, which are almost always wrong. (If you know C, the plus in
516Perl's C<open> is historically derived from the one in C's fopen(3S),
517which it ultimately calls.)
518330
519331=end original
520332
521一つ目のものは新しいファイルを作ることはなく二つ目は常に古い
333ファイルに書き込みたい場合ファイル既存の内容をどうするかを
522ファイルを上書きします。
334まず決定する必要があります。
523ものは必要があれば新しいファイルを作りますが、古いファイルを
335つの基本的な選択肢があります: 保存するか上書きするかです。
524上書きせず、ファイルのどの地点でも読み込むことができますが、
525書き込みは常に末尾に行われます。
526要するに、一つ目のものは(ほとんど常に間違っている)二つ目や三つ目の
527ものよりもかなり一般的です。
528(もし C を知っているなら、Perl の C<open> で使われるプラス記号が
529歴史的には (最終的に呼ばれることになる) C の fopen(3S) に由来しています。)
530336
531337=begin original
532338
533In fact, when it comes to updating a file, unless you're working on
339If you want to preserve any existing contents, then you want to open the file
534a binary file as in the WTMP case above, you probably don't want to
340in append mode. As in the shell, in Perl you use C<<< ">>" >>> to open an
535use this approach for updating. Instead, Perl's B<-i> flag comes to
341existing file in append mode. C<<< ">>" >>> creates the file if it does not
536the rescue. The following command takes all the C, C++, or yacc source
342already exist.
537or header files and changes all their foo's to bar's, leaving
538the old version in the original filename with a ".orig" tacked
539on the end:
540343
541344=end original
542345
543実際、ファイルを更新するとき、上述 WTMP の場合のようなバイナリファイル
346既存内容を保存したい場合ファイルを追記モードで開きます。
544対して作業をするのでない限り、おそら更新のためにこの手法を
347シェルと同様に、 Perl でも既存ファイルを追記モードくために
545使いたくないでしょう
348C<<< ">>" >>> が使われます
546代わりにPerl B<-i> フラグが助けになります。
349ファイルがない場合C<<< ">>" >>> ァイルを作ります。
547以下のコマンドは C, C++, yacc 全てののソースファイルとヘッダファイルを
548取って、その中の全ての foo を bar に変更し、原版は元のファイル名の末尾に
549".orig" を付けたファイルに保持します:
550350
551 $ perl -i.orig -pe 's/\bfoo\b/bar/g' *.[Cchy]
351 my $handle = undef;
352 my $filename = "/some/path/to/a/textfile/goes/here";
353 my $encoding = ":encoding(UTF-8)";
552354
553=begin original
355 open($handle, ">> $encoding", $filename)
356 || die "$0: can't open $filename for appending: $!";
554357
555This is a short cut for some renaming games that are really
556the best way to update textfiles. See the second question in
557L<perlfaq5> for more details.
558
559=end original
560
561これは実際にはテキストファイルを更新するための最良の方法であるリネーム
562手法へのショートカットです。
563さらなる詳細については L<perlfaq5> の 2 番目の質問を参照してください。
564
565=head2 Filters
566
567(フィルタ)
568
569358=begin original
570359
571One of the most common uses for C<open> is one you never
360Now you can write to that filehandle using any of C<print>, C<printf>,
572even notice. When you process the ARGV filehandle using
361C<say>, C<write>, or C<syswrite>.
573C<< <ARGV> >>, Perl actually does an implicit open
574on each file in @ARGV. Thus a program called like this:
575362
576363=end original
577364
578C<open> のもっとも一般的な使い方の一つは、使っていることを
365これでこのハンドルに対して C<print>, C<printf>,
579気づすらしないものです。
366C<say>, C<write>, C<syswrite> を使って書込めます。
580ARGV ファイルハンドルを C<< <ARGV> >> を使って処理するとき、Perl は
581実際は @ARGV の各ファイルを暗黙の内に開いています。
582従って、以下のようなプログラムは:
583367
584 $ myprogram file1 file2 file3
585
586368=begin original
587369
588can have all its files opened and processed one at a time
370As noted above, if the file does not already exist, then the append-mode open
589using a construct no more complex than:
371will create it for you. But if the file does already exist, its contents are
372safe from harm because you will be adding your new text past the end of the
373old text.
590374
591375=end original
592376
593以下のようなものより複雑な構文を使わなくてもそれぞれのファイル
377前述したよう、ファイルが既に存在していない場合、追記モードで開くと
594開いて一度に処理できます:
378ファイルを作ります
379しかしファイルが既に存在している場合、その内容は保護されます; 新しいテキストは
380既存のテキストの末尾に追加されるからです。
595381
596 while (<>) {
597 # do something with $_
598 }
599
600382=begin original
601383
602If @ARGV is empty when the loop first begins, Perl pretends you've opened
384On the other hand, sometimes you want to clobber whatever might already be
603up minus, that is, the standard input. In fact, $ARGV, the currently
385there. To empty out a file before you start writing to it, you can open it
604open file during C<< <ARGV> >> processing, is even set to "-"
386in write-only mode:
605in these circumstances.
606387
607388=end original
608389
609ループが最初開始したときに @ARGV が空なら、Perl はマイナス記号
390一方、時々、既何かがあっても上書きしたときもあります。
610(つまり標準入力) 開いたかのように振舞いま
391書き込み始め前にファイルを消ために、書き込み専用モードで
611実際、C<< <ARGV> >> で現在いているファイルを示 $ARGV には、
392くことができま:
612この慣習によって "-" がセットされます。
613393
614=begin original
394 my $handle = undef;
395 my $filename = "/some/path/to/a/textfile/goes/here";
396 my $encoding = ":encoding(UTF-8)";
615397
616You are welcome to pre-process your @ARGV before starting the loop to
398 open($handle, "> $encoding", $filename)
617make sure it's to your liking. One reason to do this might be to remove
399 || die "$0: can't open $filename in write-open mode: $!";
618command options beginning with a minus. While you can always roll the
619simple ones by hand, the Getopts modules are good for this:
620400
621=end original
622
623好みの形にするために、ループの開始前に @ARGV を前処理しても問題ありません。
624こうするための理由の一つは、マイナスから始まるコマンドオプションを
625削除するためです。
626いつでも自分で単純なものを作ることができる一方、
627Getopts モジュールはこれを行うのによいものです:
628
629 use Getopt::Std;
630
631 # -v, -D, -o ARG, sets $opt_v, $opt_D, $opt_o
632 getopts("vDo:");
633
634 # -v, -D, -o ARG, sets $args{v}, $args{D}, $args{o}
635 getopts("vDo:", \%args);
636
637401=begin original
638402
639Or the standard Getopt::Long module to permit named arguments:
403Here again Perl works just like the shell in that the C<< ">" >> clobbers
404an existing file.
640405
641406=end original
642407
643あるいは、名前付き引数使えるようにするための
408ここで再び Perl シェルと同様に動作しC<< ">" >> は既存ファイル
644標準の Getopt::Long モジュールもあります:
409上書きします
645410
646 use Getopt::Long;
647 GetOptions( "verbose" => \$verbose, # --verbose
648 "Debug" => \$debug, # --Debug
649 "output=s" => \$output );
650 # --output=somestring or --output somestring
651
652411=begin original
653412
654Another reason for preprocessing arguments is to make an empty
413As with the append mode, when you open a file in write-only mode,
655argument list default to all files:
414you can now write to that filehandle using any of C<print>, C<printf>,
415C<say>, C<write>, or C<syswrite>.
656416
657417=end original
658418
659引数前処理するためのもう一つの理由は空引数リストの時は
419追記モードと同様に、ファイル書き込みモードで開くと
660デフォルトで全のファイルとする場合です:
420C<print>, C<printf>, C<say>, C<write>, C<syswrite> を使っ
421ファイルハンドルに書き込めるようになります。
661422
662 @ARGV = glob("*") unless @ARGV;
663
664423=begin original
665424
666You could even filter out all but plain, text files. This is a bit
425What about read-write mode? You should probably pretend it doesn't exist,
667silent, of course, and you might prefer to mention them on the way.
426because opening text files in read-write mode is unlikely to do what you
427would like. See L<perlfaq5> for details.
668428
669429=end original
670430
671プレーンなテキストファイル以外をフィルタリングすることもでます。
431読み書モードについては?
672れはもちろん少静かので、途中でそれに言及したいかもれません。
432おそらくそれは存在しないというふりをした方がよょう;
433なぜならテキストファイルを読み書きモードで開いても
434おそらくあなたが望んでいることをしないからです。
435詳しくは L<perlfaq5> を参照してください。
673436
674 @ARGV = grep { -f && -T } @ARGV;
437=head1 Opening Binary Files
675438
676=begin original
439(バイナリファイルを開く)
677440
678If you're using the B<-n> or B<-p> command-line options, you
679should put changes to @ARGV in a C<BEGIN{}> block.
680
681=end original
682
683もし B<-n> や B<-p> のコマンドラインオプションを使っているなら、
684@ARGV への変更は C<BEGIN{}> ブロックで行うべきです。
685
686441=begin original
687442
688Remember that a normal C<open> has special properties, in that it might
443If the file to be opened contains binary data instead of text characters,
689call fopen(3S) or it might called popen(3S), depending on what its
444then the C<MODE> argument to C<open> is a little different. Instead of
690argument looks like; that's why it's sometimes called "magic open".
445specifying the encoding, you tell Perl that your data are in raw bytes.
691Here's an example:
692446
693447=end original
694448
695通常の C<open> 特別特性を持っていて、引数が何に見えかによって、
449開こうとしているファイルがテキスト文字ではなくバイナリデータが含まれている
696fopen(3S) を呼ぶかもしれませんしpopen(3S) を呼ぶかもせん;
450場合C<open> の C<MODE> 引数は少異なるものになりす。
697これが時々「マジカルに開く」と呼ばれ理由す。
451エンコーディングを指定す代わりに、データが生のバイト列あることを
698以下は例で:
452Perl に知らせま
699453
700 $pwdinfo = `domainname` =~ /^(\(none\))?$/
454 my $filename = "/some/path/to/a/binary/file/goes/here";
701 ? '< /etc/passwd'
455 my $encoding = ":raw :bytes"
702 : 'ypcat passwd |';
456 my $handle = undef; # this will be filled in on success
703457
704 open(PWD, $pwdinfo)
705 or die "can't open $pwdinfo: $!";
706
707458=begin original
708459
709This sort of thing also comes into play in filter processing. Because
460And then open as before, choosing C<<< "<" >>>, C<<< ">>" >>>, or
710C<< <ARGV> >> processing employs the normal, shell-style Perl C<open>,
461C<<< ">" >>> as needed:
711it respects all the special things we've already seen:
712462
713463=end original
714464
715ようなことはフィルタ処理でも起こます。
465それから前述、必要に応じて
716C<< <ARGV> >> 処理は通常のシェル風の Perl C<open> を用いるので、
466C<<< "<" >>>, C<<< ">>" >>>, C<<< ">" >>> 選びます:
717今までに見てきた全ての特別なことが反映されます:
718467
719 $ myprogram f1 "cmd1|" - f2 "cmd2|" f3 < tmpfile
468 open($handle, "< $encoding", $filename)
469 || die "$0: can't open $filename for reading: $!";
720470
721=begin original
471 open($handle, ">> $encoding", $filename)
472 || die "$0: can't open $filename for appending: $!";
722473
723That program will read from the file F<f1>, the process F<cmd1>, standard
474 open($handle, "> $encoding", $filename)
724input (F<tmpfile> in this case), the F<f2> file, the F<cmd2> command,
475 || die "$0: can't open $filename in write-open mode: $!";
725and finally the F<f3> file.
726476
727=end original
728
729このプログラムはファイル F<f1>、プロセス F<cmd1>、標準入力
730(この場合は F<tmpfile>)、ファイル F<f2>、コマンド F<cmd2>、
731ファイル F<f3> から読み込みます。
732
733477=begin original
734478
735Yes, this also means that if you have files named "-" (and so on) in
479Alternately, you can change to binary mode on an existing handle this way:
736your directory, they won't be processed as literal files by C<open>.
737You'll need to pass them as "./-", much as you would for the I<rm> program,
738or you could use C<sysopen> as described below.
739480
740481=end original
741482
742はい、これは、"-" (あるいは同じような) 名前持つファルがある場合、
483あるいは、次のようにして既に存在しているハンドルナリモードに
743C<open> によってそのまま処理することができないことも意味します
484変えることが出来ます:
744I<rm> プログラムに対して行うのと同様に "./-" という形で渡すか、後述する
745C<sysopen> を使う必要があります。
746485
747=begin original
486 binmode($handle) || die "cannot binmode handle";
748487
749One of the more interesting applications is to change files of a certain
750name into pipes. For example, to autoprocess gzipped or compressed
751files by decompressing them with I<gzip>:
752
753=end original
754
755もっと興味深いアプリケーションの一つは、ある名前を持ったファイルを
756パイプに変更するものです。
757例えば、gzip や compress されたファイルを、I<gzip> を使って自動的に
758展開するには:
759
760 @ARGV = map { /\.(gz|Z)$/ ? "gzip -dc $_ |" : $_ } @ARGV;
761
762488=begin original
763489
764Or, if you have the I<GET> program installed from LWP,
490This is especially handy for the handles that Perl has already opened for you.
765you can fetch URLs before processing them:
766491
767492=end original
768493
769あるいは、LWP からインストールされる I<GET> プログラムなら、
494これは、Perl既に開いていハンドルに対して特に有用です。
770処理する前に URL をフェッチできます:
771495
772 @ARGV = map { m#^\w+://# ? "GET $_ |" : $_ } @ARGV;
496 binmode(STDIN) || die "cannot binmode STDIN";
497 binmode(STDOUT) || die "cannot binmode STDOUT";
773498
774499=begin original
775500
776It's not for nothing that this is called magic C<< <ARGV> >>.
501You can also pass C<binmode> an explicit encoding to change it on the fly.
777Pretty nifty, eh?
502This isn't exactly "binary" mode, but we still use C<binmode> to do it:
778503
779504=end original
780505
781これがマジカルな C<< <ARGV> >> と呼ばれるのは理由のないことではありません。
506また、その場で変更するために C<binmode> に明示的にエンコーディングを
782かなりしゃれてるしょ?
507渡すこともきます。
508これは正確には「バイナリ」モードではありませんが、それでも
509これをするために C<binmode> を使います:
783510
784=head1 Open E<agrave> la C
511 binmode(STDIN, ":encoding(MacRoman)") || die "cannot binmode STDIN";
512 binmode(STDOUT, ":encoding(UTF-8)") || die "cannot binmode STDOUT";
785513
786(C 風に開く)
787
788514=begin original
789515
790If you want the convenience of the shell, then Perl's C<open> is
516Once you have your binary file properly opened in the right mode, you can
791definitely the way to go. On the other hand, if you want finer precision
517use all the same Perl I/O functions as you used on text files. However,
792than C's simplistic fopen(3S) provides you should look to Perl's
518you may wish to use the fixed-size C<read> instead of the variable-sized
793C<sysopen>, which is a direct hook into the open(2) system call.
519C<readline> for your input.
794That does mean it's a bit more involved, but that's the price of
795precision.
796520
797521=end original
798522
799シェの便利さ求めてるなら、Perl の C<open> はまさぴったりす。
523一旦バイナリファイルを正しモードで適切開くと、テキストファイル
800一方、C 単純な fopen(3S) が提供しているものより高い精度求めているなら、
524使ったもと全て同じ Perl I/O 関数使えます。
801open(2) システムコールへの直接的なフックであるPerl の
525しかし入力に対して可変長の C<readline> ではなく固定長
802C<sysopen> を見るべき
526C<read> を使った方が良いしょう
803これはもう少し深く関わることを意味しますが、これは精度のコストです。
804527
805528=begin original
806529
807C<sysopen> takes 3 (or 4) arguments.
530Here's an example of how to copy a binary file:
808531
809532=end original
810533
811C<sysopen> 3 (または 4) 引数取りま
534次のものバイナリファイルコピーる例です:
812535
813 sysopen HANDLE, PATH, FLAGS, [MASK]
536 my $BUFSIZ = 64 * (2 ** 10);
537 my $name_in = "/some/input/file";
538 my $name_out = "/some/output/flie";
814539
815=begin original
540 my($in_fh, $out_fh, $buffer);
816541
817The HANDLE argument is a filehandle just as with C<open>. The PATH is
542 open($in_fh, "<", $name_in)
818a literal path, one that doesn't pay attention to any greater-thans or
543 || die "$0: cannot open $name_in for reading: $!";
819less-thans or pipes or minuses, nor ignore whitespace. If it's there,
544 open($out_fh, ">", $name_out)
820it's part of the path. The FLAGS argument contains one or more values
545 || die "$0: cannot open $name_out for writing: $!";
821derived from the Fcntl module that have been or'd together using the
822bitwise "|" operator. The final argument, the MASK, is optional; if
823present, it is combined with the user's current umask for the creation
824mode of the file. You should usually omit this.
825546
826=end original
547 for my $fh ($in_fh, $out_fh) {
548 binmode($fh) || die "binmode failed";
549 }
827550
828HANDLE 引数は C<open> と同様のファイルハンドルです。
551 while (read($in_fh, $buffer, $BUFSIZ)) {
829PATH はリテラルなパスで、大なりや小なりやパイプやマイナスや空白の
552 unless (print $out_fh $buffer) {
830無視といったことに一切注意を払いません。
553 die "couldn't write to $name_out: $!";
831もしこれらの文字があれば、それはパスの一部です。
554 }
832FLAGS 引数は、ビット単位 "|" 演算子で結合できる、Fcntl モジュールに
555 }
833由来する一つ以上の値を指定します。
834最後の引数である MASK はオプションです; もしあれば、これは
835ファイルの作成モードのためのユーザーの現在の umask と組み合わされます。
836普通はこれは省略するべきです。
837556
838=begin original
557 close($in_fh) || die "couldn't close $name_in: $!";
558 close($out_fh) || die "couldn't close $name_out: $!";
839559
840Although the traditional values of read-only, write-only, and read-write
560=head1 Opening Pipes
841are 0, 1, and 2 respectively, this is known not to hold true on some
842systems. Instead, it's best to load in the appropriate constants first
843from the Fcntl module, which supplies the following standard flags:
844561
845=end original
562(パイプを開く)
846563
847読み込み専用、書き込み専用、読み書きを示す伝統的な値は
848それぞれ 0, 1, 2 ですが、これが正しくないシステムもあることが
849知られています。
850代わりに、以下の標準フラグを提供している Fcntl モジュールから
851最初に適切な定数を読み込むのが最善です:
852
853 O_RDONLY Read only
854 O_WRONLY Write only
855 O_RDWR Read and write
856 O_CREAT Create the file if it doesn't exist
857 O_EXCL Fail if the file already exists
858 O_APPEND Append to the file
859 O_TRUNC Truncate the file
860 O_NONBLOCK Non-blocking access
861
862564=begin original
863565
864Less common flags that are sometimes available on some operating
566Perl also lets you open a filehandle into an external program or shell
865systems include C<O_BINARY>, C<O_TEXT>, C<O_SHLOCK>, C<O_EXLOCK>,
567command rather than into a file. You can do this in order to pass data
866C<O_DEFER>, C<O_SYNC>, C<O_ASYNC>, C<O_DSYNC>, C<O_RSYNC>,
568from your Perl program to an external command for further processing, or
867C<O_NOCTTY>, C<O_NDELAY> and C<O_LARGEFILE>. Consult your open(2)
569to receive data from another program for your own Perl program to
868manpage or its local equivalent for details. (Note: starting from
570process.
869Perl release 5.6 the C<O_LARGEFILE> flag, if available, is automatically
870added to the sysopen() flags because large files are the default.)
871571
872572=end original
873573
874オペレーティングシステムによっては、
574Perl またファイルではなく外部プログラムやシェルコマンドへの
875 C<O_BINARY>, C<O_TEXT>, C<O_SHLOCK>, C<O_EXLOCK>,
575ファイルハンドルも開きます。
876C<O_DEFER>, C<O_SYNC>, C<O_ASYNC>, C<O_DSYNC>, C<O_RSYNC>,
576これを、更なる処理のために Perl プログラムから外部コマンドへ渡すため、
877C<O_NOCTTY>, C<O_NDELAY>, C<O_LARGEFILE> ような、それほど有名ではない
577または処理する Perl プログラムために他のプログラムからデータを
878フラグも利用可能です。
578受け取るために行えます。
879詳しくは open(2) man ページその等価物を参照してください。
880(注意: Perl リリース 5.6 から、もし利用可能なら、sysopen() のフラグに
881自動的に C<O_LARGEFILE> フラグが付きます; 大きなファイルがデフォルトに
882なったからです。)
883579
884580=begin original
885581
886Here's how to use C<sysopen> to emulate the simple C<open> calls we had
582Filehandles into commands are also known as I<pipes>, since they work on
887before. We'll omit the C<|| die $!> checks for clarity, but make sure
583similar inter-process communication principles as Unix pipelines. Such a
888you always check the return values in real code. These aren't quite
584filehandle has an active program instead of a static file on its
889the same, since C<open> will trim leading and trailing whitespace,
585external end, but in every other sense it works just like a more typical
890but you'll get the idea.
586file-based filehandle, with all the techniques discussed earlier in this
587article just as applicable.
891588
892589=end original
893590
894これは、前述した単純な C<open> をエミュレートるために C<sysopen> を
591コマンドへのファイルハンドルは、I<パイプ> としても知られま;
895使方法です。
592Unix パイプラインとい似たようなプロセス間通信原則に基づいて
896明確化のために C<|| die $!> のチェックは省略しましたが、実際のコード
593動作するからす。
897常に返り値をチェックするようにしてださい。
594そのようなファイルハンドルは、外側が静的なファイルではな
898C<open> は前後空白を削除するのは全く同じとうわけでありませんが、
595動作中プログラムすが、そ以外の点につ
899想像はできるでしょう
596より典型的なファイルベースのファイルハンドルとちょうど同じように
597動作し、この文書で既に議論した全てのテクニックが利用可能です。
900598
901599=begin original
902600
903To open a file for reading:
601As such, you open a pipe using the same C<open> call that you use for
602opening files, setting the second (C<MODE>) argument to special
603characters that indicate either an input or an output pipe. Use C<"-|"> for a
604filehandle that will let your Perl program read data from an external
605program, and C<"|-"> for a filehandle that will send data to that
606program instead.
904607
905608=end original
906609
907ファイルを読み込み用開くに:
6102 番目の (C<MODE>) 引数パイプの入力また出力を示す特殊な文字を
611設定することで、ファイルを開くのに使うのと同じ C<open> で
612パイプを開きます。
613Perl プログラムが外部プログラムからデータを読み込むファイルハンドルには
614C<"-|"> を使います; プログラムにデータを送るファイルハンドルには
615C<"|-"> を使います。
908616
909 open(FH, "< $path");
617=head2 Opening a pipe for reading
910 sysopen(FH, $path, O_RDONLY);
911618
912=begin original
619(読み込み用にパイプを開く)
913620
914To open a file for writing, creating a new file if needed or else truncating
915an old file:
916
917=end original
918
919ファイルを書き込み用に開いて、必要なら新しいファイルを作り、そうでなければ
920古いファイルを切り詰めるには:
921
922 open(FH, "> $path");
923 sysopen(FH, $path, O_WRONLY | O_TRUNC | O_CREAT);
924
925621=begin original
926622
927To open a file for appending, creating one if necessary:
623Let's say you'd like your Perl program to process data stored in a nearby
624directory called C<unsorted>, which contains a number of textfiles.
625You'd also like your program to sort all the contents from these files
626into a single, alphabetically sorted list of unique lines before it
627starts processing them.
928628
929629=end original
930630
931ファイルを追加用に開い、もし必要なら新しファイルを作には:
631たくさんのテキストファイルが含まれている、C<unsorted> と呼ばれる
632近くのディレクトリに保管されているデータを処理する
633Perl プログラムが欲しいとしましょう。
634また、処理を開始する前に、複数のファイルを単一の、ユニークな行を
635アルファベット順にソートしたいとします。
932636
933 open(FH, ">> $path");
934 sysopen(FH, $path, O_WRONLY | O_APPEND | O_CREAT);
935
936637=begin original
937638
938To open a file for update, where the file must already exist:
639You could do this through opening an ordinary filehandle into each of
640those files, gradually building up an in-memory array of all the file
641contents you load this way, and finally sorting and filtering that array
642when you've run out of files to load. I<Or>, you could offload all that
643merging and sorting into your operating system's own C<sort> command by
644opening a pipe directly into its output, and get to work that much
645faster.
939646
940647=end original
941648
942存在しているファイルを更新用にくには:
649それぞれのファイルして通常のファイルハンドルを開き、
650このようにして読み込んだ全てのファイルの内容を徐々にメモリ内の配列に
651構築し、読み込むファイルがなくなったら最後にソートとフィルタリングをする、
652という形でこれを行うことも出来ます。
653I<あるいは>、結合とソートをオペレーティング自身の C<sort> コマンドに
654任せて、その出力を直接パイプで開くことで、遙かに速く作業することも出来ます。
943655
944 open(FH, "+< $path");
945 sysopen(FH, $path, O_RDWR);
946
947656=begin original
948657
949And here are things you can do with C<sysopen> that you cannot do with
658Here's how that might look:
950a regular C<open>. As you'll see, it's just a matter of controlling the
951flags in the third argument.
952659
953660=end original
954661
955そしてここで普通 C<open> は出来ないことを C<sysopen> でしていま
662以下、これがどように見えるかです:
956見てきたように、これは単に 3 番目の引数のフラグの制御の問題です。
957663
958=begin original
664 open(my $sort_fh, '-|', 'sort -u unsorted/*.txt')
665 or die "Couldn't open a pipe into sort: $!";
959666
960To open a file for writing, creating a new file which must not previously
667 # And right away, we can start reading sorted lines:
961exist:
668 while (my $line = <$sort_fh>) {
669 #
670 # ... Do something interesting with each $line here ...
671 #
672 }
962673
963=end original
964
965既に存在していたりはしない新しいファイルを作成して、ファイルを書き込み用に
966開くには:
967
968 sysopen(FH, $path, O_WRONLY | O_EXCL | O_CREAT);
969
970674=begin original
971675
972To open a file for appending, where that file must already exist:
676The second argument to C<open>, C<"-|">, makes it a read-pipe into a
677separate program, rather than an ordinary filehandle into a file.
973678
974679=end original
975680
976既に存在している必要があるファイルを追加用に開くには:
681C<open> の 2 番目の引数である C<"-|"> は、ファイルへの通常の
682ファイルハンドルではなく、別個のプログラムへの読み込みパイプにします。
977683
978 sysopen(FH, $path, O_WRONLY | O_APPEND);
979
980684=begin original
981685
982To open a file for update, creating a new file if necessary:
686Note that the third argument to C<open> is a string containing the
687program name (C<sort>) plus all its arguments: in this case, C<-u> to
688specify unqiue sort, and then a fileglob specifying the files to sort.
689The resulting filehandle C<$sort_fh> works just like a read-only (C<<
690"<" >>) filehandle, and your program can subsequently read data
691from it as if it were opened onto an ordinary, single file.
983692
984693=end original
985694
986必要なら新しいファイルを作成して、ファイルを更新用に開くに:
695C<open> の 3 番目の引数
696プログラム名 (C<sort>) とその全ての引数を含んだ文字列です:
697この場合、C<-u> はユニークソートを指定し、それからファイルグロブは
698ソートするファイルを指定することに注意してください。
699結果のファイルハンドル C<$sort_fh> は
700ちょうど読み込み専用 (C<< "<" >>) ファイルハンドルのように動作し、
701プログラムは、通常の単一のファイルが開かれたかのように、
702引き続いてそこからデータを読み込むことができます。
987703
988 sysopen(FH, $path, O_RDWR | O_CREAT);
704=head2 Opening a pipe for writing
989705
990=begin original
706(書き込み用にパイプを開く)
991707
992To open a file for update, where that file must not already exist:
993
994=end original
995
996予め存在していてはならないファイルを交信用に開くには:
997
998 sysopen(FH, $path, O_RDWR | O_EXCL | O_CREAT);
999
1000708=begin original
1001709
1002To open a file without blocking, creating one if necessary:
710Continuing the previous example, let's say that your program has
711completed its processing, and the results sit in an array called
712C<@processed>. You want to print these lines to a file called
713C<numbered.txt> with a neatly formatted column of line-numbers.
1003714
1004715=end original
1005716
1006必要ならファイルを作成して、ファイルをブックずに開くには:
717前回の例の続きとして、グラムの処理を完成さて、
718結果は C<@processed> と呼ばれる配列に入っているとしましょう。
719これらの行を C<numbered.txt> というファイル名に、
720いい感じに整形された行番号の列と共に出力したいとします。
1007721
1008 sysopen(FH, $path, O_WRONLY | O_NONBLOCK | O_CREAT);
1009
1010=head2 Permissions E<agrave> la mode
1011
1012(権限モード)
1013
1014722=begin original
1015723
1016If you omit the MASK argument to C<sysopen>, Perl uses the octal value
724Certainly you could write your own code to do this ? or, once again,
10170666. The normal MASK to use for executables and directories should
725you could kick that work over to another program. In this case, C<cat>,
1018be 0777, and for anything else, 0666.
726running with its own C<-n> option to activate line numbering, should do
727the trick:
1019728
1020729=end original
1021730
1022C<sysopen> の MASK 引数省略すると、Perl 8 進数の 0666 を使ます。
731確かにこれをするコードを自分で書くこもできます - あるは、再び、
1023実行ファイルとディレクトリ対す通常の MASK は 0777、それ以外の
732この作業を他のプログラムこともきます。
1024ファイルでは 0666す。
733この場合、C<cat> を、行番号付けを有効にする C<-n> オプション込み
734実行するには、次の技を使います:
1025735
1026=begin original
736 open(my $cat_fh, '|-', 'cat -n > numbered.txt')
737 or die "Couldn't open a pipe into cat: $!";
1027738
1028Why so permissive? Well, it isn't really. The MASK will be modified
739 for my $line (@processed) {
1029by your process's current C<umask>. A umask is a number representing
740 print $cat_fh $line;
1030I<disabled> permissions bits; that is, bits that will not be turned on
1031in the created file's permissions field.
1032
1033=end original
1034
1035なぜそんなに権限を与えるのでしょう?
1036えっと、実際にはそうではありません。
1037MASK はプロセスの現在の C<umask> で修正されます。
1038umask は I<無効にする> 許可ビットを表現する数値です; つまり、
1039作成したファイルの許可フィールドを有効にすることはないということです。
1040
1041=begin original
1042
1043For example, if your C<umask> were 027, then the 020 part would
1044disable the group from writing, and the 007 part would disable others
1045from reading, writing, or executing. Under these conditions, passing
1046C<sysopen> 0666 would create a file with mode 0640, since C<0666 & ~027>
1047is 0640.
1048
1049=end original
1050
1051例えば、C<umask> が 027 の場合、020 の部分はグループによる書き込みと
1052実行を無効にし、007 の部分は他のユーザーによる読み込み、書き込み、
1053実行を無効にします。
1054この条件では、C<sysopen> に 0666 を渡すとモード 0640 でファイルを作ります;
1055C<0666 & ~027> は 0640 だからです。
1056
1057=begin original
1058
1059You should seldom use the MASK argument to C<sysopen()>. That takes
1060away the user's freedom to choose what permission new files will have.
1061Denying choice is almost always a bad thing. One exception would be for
1062cases where sensitive or private data is being stored, such as with mail
1063folders, cookie files, and internal temporary files.
1064
1065=end original
1066
1067C<sysopen()> に MASK 引数を使うことはほとんどないでしょう。
1068これは、新しいファイルにどのパーミッションを与えるかというユーザーの
1069自由を奪います。
1070選択を拒むということは、ほとんど常に悪いことです。
1071一つの例外は、メールフォルダ、クッキーファイル、内部用一時ファイルのような、
1072微妙な、あるいはプライベートなデータを保管する場合でしょう。
1073
1074=head1 Obscure Open Tricks
1075
1076(わかりにくい開くときの小技)
1077
1078=head2 Re-Opening Files (dups)
1079
1080(ファイルを再び開く(dup))
1081
1082=begin original
1083
1084Sometimes you already have a filehandle open, and want to make another
1085handle that's a duplicate of the first one. In the shell, we place an
1086ampersand in front of a file descriptor number when doing redirections.
1087For example, C<< 2>&1 >> makes descriptor 2 (that's STDERR in Perl)
1088be redirected into descriptor 1 (which is usually Perl's STDOUT).
1089The same is essentially true in Perl: a filename that begins with an
1090ampersand is treated instead as a file descriptor if a number, or as a
1091filehandle if a string.
1092
1093=end original
1094
1095既に開いているファイルハンドルを持っている時に、これを複製して
1096もう一つのハンドルがほしくなる場合がときどきあります。
1097シェルでは、リダイレクトをするときにファイル記述子番号の前に
1098アンパサンドを置きます。
1099例えば C<< 2>&1 >> は、記述子 2 (これは Perl では STDERR) を
1100記述子 1 (これは Perl では普通は STDOUT) にリダイレクトします。
1101同じことは Perl でも基本的には真です: アンパサンドで始まるファイル名は、
1102それが数値ならファイル記述子、文字列ならファイルハンドルとして
1103扱われます。
1104
1105 open(SAVEOUT, ">&SAVEERR") || die "couldn't dup SAVEERR: $!";
1106 open(MHCONTEXT, "<&4") || die "couldn't dup fd4: $!";
1107
1108=begin original
1109
1110That means that if a function is expecting a filename, but you don't
1111want to give it a filename because you already have the file open, you
1112can just pass the filehandle with a leading ampersand. It's best to
1113use a fully qualified handle though, just in case the function happens
1114to be in a different package:
1115
1116=end original
1117
1118これは、もし関数がファイル名を想定しているけれども、既にファイルは
1119開いているのでファイル名を渡したくない場合、単に先頭にアンパサンドを
1120付けたファイルハンドルを渡せるということを意味します。
1121しかし、万が一関数がたまたま違うパッケージだったときのために、完全修飾した
1122ハンドルを渡すのが最善です:
1123
1124 somefunction("&main::LOGFILE");
1125
1126=begin original
1127
1128This way if somefunction() is planning on opening its argument, it can
1129just use the already opened handle. This differs from passing a handle,
1130because with a handle, you don't open the file. Here you have something
1131you can pass to open.
1132
1133=end original
1134
1135この方法により、somefunction() が引数の値を開いた場合、
1136単に既に開いているハンドルを使えます。
1137これはハンドルを渡すのとは違います; なぜならハンドルではファイルを
1138開かないからです。
1139こちらでは開くときに指定できるものが指定できます。
1140
1141=begin original
1142
1143If you have one of those tricky, newfangled I/O objects that the C++
1144folks are raving about, then this doesn't work because those aren't a
1145proper filehandle in the native Perl sense. You'll have to use fileno()
1146to pull out the proper descriptor number, assuming you can:
1147
1148=end original
1149
1150もし、C++ 民が夢中になっているような巧妙で目新しい I/O オブジェクトの一つを
1151使っているなら、これらはネイティブな Perl 的に適切なファイルハンドルでは
1152ないので、上述のような方法は動作しません。
1153適切な記述子番号を得るために fileno() を使う必要があります; それが出来ると
1154仮定すれば:
1155
1156 use IO::Socket;
1157 $handle = IO::Socket::INET->new("www.perl.com:80");
1158 $fd = $handle->fileno;
1159 somefunction("&$fd"); # not an indirect function call
1160
1161=begin original
1162
1163It can be easier (and certainly will be faster) just to use real
1164filehandles though:
1165
1166=end original
1167
1168しかし、単に普通のファイルハンドルを使う方が簡単でしょう
1169(そして確実に高速です):
1170
1171 use IO::Socket;
1172 local *REMOTE = IO::Socket::INET->new("www.perl.com:80");
1173 die "can't connect" unless defined(fileno(REMOTE));
1174 somefunction("&main::REMOTE");
1175
1176=begin original
1177
1178If the filehandle or descriptor number is preceded not just with a simple
1179"&" but rather with a "&=" combination, then Perl will not create a
1180completely new descriptor opened to the same place using the dup(2)
1181system call. Instead, it will just make something of an alias to the
1182existing one using the fdopen(3S) library call. This is slightly more
1183parsimonious of systems resources, although this is less a concern
1184these days. Here's an example of that:
1185
1186=end original
1187
1188もしファイルハンドルや記述子番号の前にあるのが単なる "&" ではなく "&=" の
1189組み合わせの場合、Perl は dup(2) システムコールを使って同じ場所で開いた
1190完全に新しい記述子は作りません。
1191代わりに、fdopen(3S) ライブラリコールを使ってすでにある記述子の別名的な
1192ものを作ります。
1193これはシステムのリソースを少しケチることが出来ますが、最近ではこれは
1194あまり関心を持たれなくなりました。
1195以下はこの例です:
1196
1197 $fd = $ENV{"MHCONTEXTFD"};
1198 open(MHCONTEXT, "<&=$fd") or die "couldn't fdopen $fd: $!";
1199
1200=begin original
1201
1202If you're using magic C<< <ARGV> >>, you could even pass in as a
1203command line argument in @ARGV something like C<"<&=$MHCONTEXTFD">,
1204but we've never seen anyone actually do this.
1205
1206=end original
1207
1208もしマジカルな C<< <ARGV> >> を使っているなら、C<"<&=$MHCONTEXTFD"> の
1209ような感じで @ARGV 内のコマンドライン引数として渡すことすら可能ですが、
1210実際にこれをしている人を見たことはありません。
1211
1212=head2 Dispelling the Dweomer
1213
1214(魔法を解く)
1215
1216=begin original
1217
1218Perl is more of a DWIMmer language than something like Java--where DWIM
1219is an acronym for "do what I mean". But this principle sometimes leads
1220to more hidden magic than one knows what to do with. In this way, Perl
1221is also filled with I<dweomer>, an obscure word meaning an enchantment.
1222Sometimes, Perl's DWIMmer is just too much like dweomer for comfort.
1223
1224=end original
1225
1226Perl は、Java のような言語よりも「空気を読む」(DWIM)言語です --
1227DWIM とは "do what I mean" の略です。
1228しかし、この原則は時々利用者が知っている以上の隠れた動作をすることが
1229あります。
1230こんな風に、Perl は (魔法を意味する不明確な単語である) I<dweomer> にも
1231満ちています。
1232時々、Perl の空気の読み方は快適さのために魔法のようになります。
1233
1234=begin original
1235
1236If magic C<open> is a bit too magical for you, you don't have to turn
1237to C<sysopen>. To open a file with arbitrary weird characters in
1238it, it's necessary to protect any leading and trailing whitespace.
1239Leading whitespace is protected by inserting a C<"./"> in front of a
1240filename that starts with whitespace. Trailing whitespace is protected
1241by appending an ASCII NUL byte (C<"\0">) at the end of the string.
1242
1243=end original
1244
1245もしマジカルな C<open> があなたにとってちょっとマジカルすぎるとしても、
1246C<sysopen> にまで戻る必要はありません。
1247ファイル名にどんな変な文字が含まれているファイルでも開くためには、
1248先頭と末尾の空白を保護する必要があります。
1249先頭の空白は、空白で始まるファイル名の前に C<"./"> を挿入することで
1250保護します。
1251末尾の空白は、文字列の末尾に ASCII NUL バイト (C<"\0">) を
1252追加することで保護します。
1253
1254 $file =~ s#^(\s)#./$1#;
1255 open(FH, "< $file\0") || die "can't open $file: $!";
1256
1257=begin original
1258
1259This assumes, of course, that your system considers dot the current
1260working directory, slash the directory separator, and disallows ASCII
1261NULs within a valid filename. Most systems follow these conventions,
1262including all POSIX systems as well as proprietary Microsoft systems.
1263The only vaguely popular system that doesn't work this way is the
1264"Classic" Macintosh system, which uses a colon where the rest of us
1265use a slash. Maybe C<sysopen> isn't such a bad idea after all.
1266
1267=end original
1268
1269これはもちろん、あなたのシステムが "." をカレントディレクトリ、
1270"/" をディレクトリの区切りとして扱い、ASCII NUL をファイル名として
1271認めていないということを仮定しています。
1272全ての POSIX システムとプロプリエタリの Microsoft システムを含む、
1273ほとんどのシステムはこの慣例に従っています。
1274これに従わない、一般的に有名な唯一のシステムは
1275"Classic" Macintosh システムです; これは他のシステムが "/" を
1276使っているところで ":" を使います。
1277おそらく、とにかく C<sysopen> を使うということはそれほど悪い考えでは
1278ありません。
1279
1280=begin original
1281
1282If you want to use C<< <ARGV> >> processing in a totally boring
1283and non-magical way, you could do this first:
1284
1285=end original
1286
1287もし、C<< <ARGV> >> の処理を、本当に退屈かつマジカルでない方法で
1288行いたいなら、まず以下のようにできます:
1289
1290 # "Sam sat on the ground and put his head in his hands.
1291 # 'I wish I had never come here, and I don't want to see
1292 # no more magic,' he said, and fell silent."
1293 for (@ARGV) {
1294 s#^([^./])#./$1#;
1295 $_ .= "\0";
1296 }
1297 while (<>) {
1298 # now process $_
1299 }
1300
1301=begin original
1302
1303But be warned that users will not appreciate being unable to use "-"
1304to mean standard input, per the standard convention.
1305
1306=end original
1307
1308但し、ユーザーは、標準入力を意味するために "-" を使うという一般的な
1309慣習が使えないということを喜ばないだろうということは
1310警告しておきます。
1311
1312=head2 Paths as Opens
1313
1314(open にパスを)
1315
1316=begin original
1317
1318You've probably noticed how Perl's C<warn> and C<die> functions can
1319produce messages like:
1320
1321=end original
1322
1323どうやって Perl の C<warn> 関数と C<die> 関数が以下のようなメッセージを
1324生成するかに気付いたでしょう:
1325
1326 Some warning at scriptname line 29, <FH> line 7.
1327
1328=begin original
1329
1330That's because you opened a filehandle FH, and had read in seven records
1331from it. But what was the name of the file, rather than the handle?
1332
1333=end original
1334
1335これは、あなたがファイルハンドル FH を開いて、そこから 7 レコードを
1336読み込んだからです。
1337しかし、ハンドルではなく、ファイル名はどうでしょう?
1338
1339=begin original
1340
1341If you aren't running with C<strict refs>, or if you've turned them off
1342temporarily, then all you have to do is this:
1343
1344=end original
1345
1346もし C<strict refs> を有効にしていないか、一時的に無効にしているなら、
1347する必要があるのは以下のことだけです:
1348
1349 open($path, "< $path") || die "can't open $path: $!";
1350 while (<$path>) {
1351 # whatever
1352 }
1353
1354=begin original
1355
1356Since you're using the pathname of the file as its handle,
1357you'll get warnings more like
1358
1359=end original
1360
1361ファイルのパス名をハンドルとして使っているので、以下のような警告が
1362出ます
1363
1364 Some warning at scriptname line 29, </etc/motd> line 7.
1365
1366=head2 Single Argument Open
1367
1368(1 引数の open)
1369
1370=begin original
1371
1372Remember how we said that Perl's open took two arguments? That was a
1373passive prevarication. You see, it can also take just one argument.
1374If and only if the variable is a global variable, not a lexical, you
1375can pass C<open> just one argument, the filehandle, and it will
1376get the path from the global scalar variable of the same name.
1377
1378=end original
1379
1380Perl の open は 2 引数を取ると言ったことを覚えていますか?
1381これは消極的なごまかしです。
1382ほら、単に 1 引数を取ることもできます。
1383変数がレキシカルではなくグローバルな変数の場合にのみ、C<open> に
13841 引数だけ(ファイルハンドル)を渡すことができます; こうすると、
1385同じ名前を持つグローバルなスカラ変数からパスを取ります。
1386
1387 $FILE = "/etc/motd";
1388 open FILE or die "can't open $FILE: $!";
1389 while (<FILE>) {
1390 # whatever
1391 }
1392
1393=begin original
1394
1395Why is this here? Someone has to cater to the hysterical porpoises.
1396It's something that's been in Perl since the very beginning, if not
1397before.
1398
1399=end original
1400
1401どうしてこれはここなんでしょう?
1402誰かがヒステリックなネズミイルカの要求を満たす必要があります。
1403これは(遅くとも)非常に初期から Perl にあります。
1404
1405=head2 Playing with STDIN and STDOUT
1406
1407(STDIN と STDOUT を扱う)
1408
1409=begin original
1410
1411One clever move with STDOUT is to explicitly close it when you're done
1412with the program.
1413
1414=end original
1415
1416STDOUT に関する一つの利口な行動は、プログラムの終了時に
1417明示的に閉じることです。
1418
1419 END { close(STDOUT) || die "can't close stdout: $!" }
1420
1421=begin original
1422
1423If you don't do this, and your program fills up the disk partition due
1424to a command line redirection, it won't report the error exit with a
1425failure status.
1426
1427=end original
1428
1429これをしないままで、このプログラムがコマンドラインリダイレクトによって
1430ディスクをいっぱいにしてしまっても、失敗状態でエラー終了しません。
1431
1432=begin original
1433
1434You don't have to accept the STDIN and STDOUT you were given. You are
1435welcome to reopen them if you'd like.
1436
1437=end original
1438
1439与えられた STDIN と STDOUT を受け入れる必要はありません。
1440もし望むなら、これらを開き直せます。
1441
1442 open(STDIN, "< datafile")
1443 || die "can't open datafile: $!";
1444
1445 open(STDOUT, "> output")
1446 || die "can't open output: $!";
1447
1448=begin original
1449
1450And then these can be accessed directly or passed on to subprocesses.
1451This makes it look as though the program were initially invoked
1452with those redirections from the command line.
1453
1454=end original
1455
1456それからこれらは直接アクセスしたり子プロセスに渡したりできます。
1457これらは、プログラムの起動時にコマンドラインからリダイレクトが
1458与えられたかのように動作します。
1459
1460=begin original
1461
1462It's probably more interesting to connect these to pipes. For example:
1463
1464=end original
1465
1466これらをパイプにつなぐ方がより興味深いでしょう。
1467例えば:
1468
1469 $pager = $ENV{PAGER} || "(less || more)";
1470 open(STDOUT, "| $pager")
1471 || die "can't fork a pager: $!";
1472
1473=begin original
1474
1475This makes it appear as though your program were called with its stdout
1476already piped into your pager. You can also use this kind of thing
1477in conjunction with an implicit fork to yourself. You might do this
1478if you would rather handle the post processing in your own program,
1479just in a different process:
1480
1481=end original
1482
1483これによって、プログラムの標準出力がが既にページャとパイプで
1484つながれているかのように見えます。
1485このようなことはまた、自分自身を暗黙に fork したものと結合するためにも
1486使えます。
1487自分自身のプログラムの別のプロセスでで後処理を扱いたい場合、
1488以下のようにできます:
1489
1490 head(100);
1491 while (<>) {
1492 print;
1493 }
1494
1495 sub head {
1496 my $lines = shift || 20;
1497 return if $pid = open(STDOUT, "|-"); # return if parent
1498 die "cannot fork: $!" unless defined $pid;
1499 while (<STDIN>) {
1500 last if --$lines < 0;
1501 print;
1502 }
1503 exit;
1504 }
1505
1506=begin original
1507
1508This technique can be applied to repeatedly push as many filters on your
1509output stream as you wish.
1510
1511=end original
1512
1513このテクニックは、繰り返しプッシュすることで、出力ストリームに好きなだけ
1514多くのフィルタを適用できます。
1515
1516=head1 Other I/O Issues
1517
1518(その他の I/O 関連の話題)
1519
1520=begin original
1521
1522These topics aren't really arguments related to C<open> or C<sysopen>,
1523but they do affect what you do with your open files.
1524
1525=end original
1526
1527これらの話題は実際には C<open> や C<sysopen> に関連したものではありませんが、
1528ファイルを開くときに行うことに影響を与えます。
1529
1530=head2 Opening Non-File Files
1531
1532(ファイルでないファイルを開く)
1533
1534=begin original
1535
1536When is a file not a file? Well, you could say when it exists but
1537isn't a plain file. We'll check whether it's a symbolic link first,
1538just in case.
1539
1540=end original
1541
1542ファイルがファイルでないときは?
1543えっと、プレーンファイルでないもののとき、と言いたいんですよね。
1544まず、念のために、それがシンボリックリンクかどうかを調べます。
1545
1546 if (-l $file || ! -f _) {
1547 print "$file is not a plain file\n";
1548 }
1549
1550=begin original
1551
1552What other kinds of files are there than, well, files? Directories,
1553symbolic links, named pipes, Unix-domain sockets, and block and character
1554devices. Those are all files, too--just not I<plain> files. This isn't
1555the same issue as being a text file. Not all text files are plain files.
1556Not all plain files are text files. That's why there are separate C<-f>
1557and C<-T> file tests.
1558
1559=end original
1560
1561えーと、ファイルの他にどんな種類のファイルがあるのでしょう?
1562ディレクトリ、シンボリックリンク、名前付きパイプ、Unix ドメインソケット、
1563キャラクタデバイス、ブロックデバイスです。
1564これらも全てファイルです -- 単に I<プレーン> ファイルではないと
1565いうだけです。
1566これはテキストファイルと同じ問題ではありません。
1567全てのテキストファイルがプレーンファイルではありません。
1568全てのプレーンファイルがテキストファイルではありません。
1569これが、C<-f> と C<-T> のファイルテストが分離している理由です。
1570
1571=begin original
1572
1573To open a directory, you should use the C<opendir> function, then
1574process it with C<readdir>, carefully restoring the directory
1575name if necessary:
1576
1577=end original
1578
1579ディレクトリを開くには、C<opendir> 関数を使って、それから
1580C<readdir> で処理します; もし必要なら注意深くディレクトリ名を復元します:
1581
1582 opendir(DIR, $dirname) or die "can't opendir $dirname: $!";
1583 while (defined($file = readdir(DIR))) {
1584 # do something with "$dirname/$file"
1585741 }
1586 closedir(DIR);
1587742
1588743=begin original
1589744
1590If you want to process directories recursively, it's better to use the
745Here, we use a second C<open> argument of C<"|-">, signifying that the
1591File::Find module. For example, this prints out all files recursively
746filehandle assigned to C<$cat_fh> should be a write-pipe. We can then
1592and adds a slash to their names if the file is a directory.
747use it just as we would a write-only ordinary filehandle, including the
748basic function of C<print>-ing data to it.
1593749
1594750=end original
1595751
1596ディレクトリを再帰的に処理したい場合はFile::Find モジュールを使った方が
752ここでC<open> の 2 番目の引数に C<"|-"> を使います;
1597いいでしょう。
753これにより、C<$cat_fh> に代入されるファイルハンドルが書き込み
1598例えば、これは全てのファ再帰的に表示して、もしファイルが
754プであることを示します。
1599ィレクトリの場合は末尾にスラッシュ追加しま
755それから、ータ C<print> る基本的な関数を含めて、
756書き込み専用の普通のファイルハンドルを使うのと同じようにこれを使えます。
1600757
1601 @ARGV = qw(.) unless @ARGV;
1602 use File::Find;
1603 find sub { print $File::Find::name, -d && '/', "\n" }, @ARGV;
1604
1605758=begin original
1606759
1607This finds all bogus symbolic links beneath a particular directory:
760Note that the third argument, specifying the command that we wish to
761pipe to, sets up C<cat> to redirect its output via that C<< ">" >>
762symbol into the file C<numbered.txt>. This can start to look a little
763tricky, because that same symbol would have meant something
764entirely different had it showed it in the second argument to C<open>!
765But here in the third argument, it's simply part of the shell command that
766Perl will open the pipe into, and Perl itself doesn't invest any special
767meaning to it.
1608768
1609769=end original
1610770
1611以下は、特定のディレクトリ以下から偽のシボリックリンク全て探しま:
771パイプしたいコマ指定る 3 番目の引数は、
772C<cat> の出力を C<< ">" >> 記号を使ってファイル C<numbered.txt> に
773リダイレクトするように指定していることに注意してください。
774これは最初は少しおかしく見えるかもしれません;
775この同じ記号は、C<open> の 2 番目の引数では全く違うものを意味するからです!
776しかし、ここ 3 番目の引数では、これは単に Perl がパイプを開く
777シェルコマンドの一部であり、Perl 自身はこれに何の特別な意味も与えません。
1612778
1613 find sub { print "$File::Find::name\n" if -l && !-e }, $dir;
779=head2 Expressing the command as a list
1614780
1615=begin original
781(コマンドをリストとして表現する)
1616782
1617As you see, with symbolic links, you can just pretend that it is
1618what it points to. Or, if you want to know I<what> it points to, then
1619C<readlink> is called for:
1620
1621=end original
1622
1623上述したように、シンボリックリンクの場合、単にそれが指しているもの振りを
1624することができます。
1625あるいは、もしそれが I<何を> 指しているのかを知りたい場合は、
1626C<readlink> を呼び出します:
1627
1628 if (-l $file) {
1629 if (defined($whither = readlink($file))) {
1630 print "$file points to $whither\n";
1631 } else {
1632 print "$file points nowhere: $!\n";
1633 }
1634 }
1635
1636=head2 Opening Named Pipes
1637
1638(名前付きパイプを開く)
1639
1640783=begin original
1641784
1642Named pipes are a different matter. You pretend they're regular files,
785For opening pipes, Perl offers the option to call C<open> with a list
1643but their opens will normally block until there is both a reader and
786comprising the desired command and all its own arguments as separate
1644a writer. You can read more about them in L<perlipc/"Named Pipes">.
787elements, rather than combining them into a single string as in the
1645Unix-domain sockets are rather different beasts as well; they're
788examples above. For instance, we could have phrased the C<open> call in
1646described in L<perlipc/"Unix-Domain TCP Clients and Servers">.
789the first example like this:
1647790
1648791=end original
1649792
1650名前付きパイプは問題です。
793パイプを開くために、Perl 、目的コマンドとそれ自身の引数を、
1651これらは普通ファイルのように振る舞いまが、こ open 普通
794前述のように単一の文字列として結合なく、
1652読み込み側と書き込み側両方ができるまでブロックされ
795別個要素として構成されたリストで C<open> を呼び出という
1653これらについては L<perlipc/"Named Pipes"> でより多くのこと
796選択肢提供しています。
1654読むことができます
797例えば、最初の例の C<open> 呼び出しは次のように書けます:
1655Unix ドメインソケットは同様にやや違うものです;
1656これらは L<perlipc/"Unix-Domain TCP Clients and Servers"> に
1657記述されています。
1658798
1659=begin original
799 open(my $sort_fh, '-|', 'sort', '-u', glob('unsorted/*.txt'))
800 or die "Couldn't open a pipe into sort: $!";
1660801
1661When it comes to opening devices, it can be easy and it can be tricky.
1662We'll assume that if you're opening up a block device, you know what
1663you're doing. The character devices are more interesting. These are
1664typically used for modems, mice, and some kinds of printers. This is
1665described in L<perlfaq8/"How do I read and write the serial port?">
1666It's often enough to open them carefully:
1667
1668=end original
1669
1670デバイスを開くときは、簡単にもなりますしトリッキーにもなります。
1671ブロックデバイスを開こうとしているなら、何をしようとしているのか
1672分かっていることを仮定します。
1673キャラクタデバイスはもっと興味深いです。
1674これらは典型的にはモデム、マウス、ある種のプリンタのために使われます。
1675これは L<perlfaq8/"How do I read and write the serial port?"> に
1676記述されています。
1677しばしば慎重に開くだけで充分です:
1678
1679 sysopen(TTYIN, "/dev/ttyS1", O_RDWR | O_NDELAY | O_NOCTTY)
1680 # (O_NOCTTY no longer needed on POSIX systems)
1681 or die "can't open /dev/ttyS1: $!";
1682 open(TTYOUT, "+>&TTYIN")
1683 or die "can't dup TTYIN: $!";
1684
1685 $ofh = select(TTYOUT); $| = 1; select($ofh);
1686
1687 print TTYOUT "+++at\015";
1688 $answer = <TTYIN>;
1689
1690802=begin original
1691803
1692With descriptors that you haven't opened using C<sysopen>, such as
804When you call C<open> this way, Perl invokes the given command directly,
1693sockets, you can set them to be non-blocking using C<fcntl>:
805bypassing the shell. As such, the shell won't try to interpret any
806special characters within the command's argument list, which might
807overwise have unwanted effects. This can make for safer, less
808error-prone C<open> calls, useful in cases such as passing in variables
809as arguments, or even just referring to filenames with spaces in them.
1694810
1695811=end original
1696812
1697ソケットように、C<sysopen> を使わずに開いた記述子の場合
813方法で C<open> を呼び出す場合、
1698C<fcntl>使っ非ブロックモードに設できます:
814Perl はシェルバイパスしされたコマンドを直接起動します
815シェルはコマンド路の引数リストの中の特殊文字を解釈しようとはしません;
816さもなければ望まない効果を生むことがあります。
817これはより安全で、C<open> 呼び出しの誤りを減らし、
818引数として変数の内容を渡すような場合に有用で、
819単に空白を含むファイルを参照する場合にも安全です。
1699820
1700 use Fcntl;
1701 my $old_flags = fcntl($handle, F_GETFL, 0)
1702 or die "can't get flags: $!";
1703 fcntl($handle, F_SETFL, $old_flags | O_NONBLOCK)
1704 or die "can't set non blocking: $!";
1705
1706821=begin original
1707822
1708Rather than losing yourself in a morass of twisting, turning C<ioctl>s,
823However, when you I<do> want to pass a meaningful metacharacter to the
1709all dissimilar, if you're going to manipulate ttys, it's best to
824shell, such with the C<"*"> inside that final C<unsorted/*.txt> argument
1710make calls out to the stty(1) program if you have it, or else use the
825here, you can't use this alternate syntax. In this case, we have worked
1711portable POSIX interface. To figure this all out, you'll need to read the
826around it via Perl's handy C<glob> built-in function, which evaluates
1712termios(3) manpage, which describes the POSIX interface to tty devices,
827its argument into a list of filenames ? and we can safely pass that
1713and then L<POSIX>, which describes Perl's interface to POSIX. There are
828resulting list right into C<open>, as shown above.
1714also some high-level modules on CPAN that can help you with these games.
1715Check out Term::ReadKey and Term::ReadLine.
1716829
1717830=end original
1718831
1719 tty を操作ようとしているなら全く異なC<ioctl> の泥沼に
832し、シェルに意味のあメタ文字を I<渡したい>
1720迷い込むのではく、もし stty(1) プログラムがあるらこれを呼び出して
833例えば最終的C<unsorted/*.txt> の中の C<"*"> のよう場合
1721さもなければ移植性ある POSIX インターフェースを使うのが最善です
834代替文法は使えません
1722れらを理解するには、まず tty デバイスへPOSIX
835この場合、引数をファイル名評価する Perl便利な C<glob> 組み込み関数で
1723インターフェースについ述している termios(3) man ページを読んで、次
836回避します; そし述したように、結果のリストを C<open> に安全
1724POSIX への Perl のインターフェースについて記述している L<POSIX> を
837渡せます。
1725読む必要があります。
1726これらのものを扱う助けになるような高レベルモジュールも CPAN にあります。
1727Term::ReadKey と Term::ReadLine を調べてください。
1728838
1729=head2 Opening Sockets
1730
1731(ソケットを開く)
1732
1733839=begin original
1734840
1735What else can you open? To open a connection using sockets, you won't use
841Note also that representing piped-command arguments in list form like
1736one of Perl's two open functions. See
842this doesn't work on every platform. It will work on any Unix-based OS
1737L<perlipc/"Sockets: Client/Server Communication"> for that. Here's an
843that provides a real C<fork> function (e.g. macOS or Linux), as well as
1738example. Once you have it, you can use FH as a bidirectional filehandle.
844on Windows when running Perl 5.22 or later.
1739845
1740846=end original
1741847
1742何を開ける?
848また、こようなリスト形式でパイプコマンド引数表現は、全ての
1743ソケットを使った接続を開くに、Perl の 2 つの open 関数のどちらも
849プラットフォームで動作するわけでないことに注意してください。
1744使いません。
850真の C<fork> 関数を提供する Unix ベースの OS (例えば macOS や Linux)、
1745そのためには L<perlipc/"Sockets: Client/Server Communication">
851および Perl 5.22 以降の Windows では動作します。
1746参照してください。
1747以下は例です。
1748これを実行すると、FH を双方向ファイルハンドルとして使えます。
1749852
1750 use IO::Socket;
853=head1 SEE ALSO
1751 local *FH = IO::Socket::INET->new("www.perl.com:80");
1752854
1753855=begin original
1754856
1755For opening up a URL, the LWP modules from CPAN are just what
857The full documentation for L<C<open>|perlfunc/open FILEHANDLE,MODE,EXPR>
1756the doctor ordered. There's no filehandle interface, but
858provides a thorough reference to this function, beyond the best-practice
1757it's still easy to get the contents of a document:
859basics covered here.
1758860
1759861=end original
1760862
1761URL を開くには、CPAN にある LWP モジュールがぴったりです。
863L<C<open>|perlfunc/open FILEHANDLE,MODE,EXPR> の完全な文書は、
1762ファイルハンドルのインタフェースはないですが
864ここでカバしているベストプラクティスベースのものを超えて
1763それでも簡単に文書中身得られます:
865関数の完全なリファレンス提供します
1764866
1765 use LWP::Simple;
1766 $doc = get('http://www.cpan.org/');
1767
1768=head2 Binary Files
1769
1770(バイナリファイル)
1771
1772=begin original
1773
1774On certain legacy systems with what could charitably be called terminally
1775convoluted (some would say broken) I/O models, a file isn't a file--at
1776least, not with respect to the C standard I/O library. On these old
1777systems whose libraries (but not kernels) distinguish between text and
1778binary streams, to get files to behave properly you'll have to bend over
1779backwards to avoid nasty problems. On such infelicitous systems, sockets
1780and pipes are already opened in binary mode, and there is currently no
1781way to turn that off. With files, you have more options.
1782
1783=end original
1784
1785最終的に (壊れていると言われる) I/O モデルに巻き込まれると寛大にも
1786呼ばれるある種の古いシステムでは、ファイルはファイルではありません --
1787少なくとも C 標準 I/O ライブラリという観点では。
1788(カーネルではなく)ライブラリがテキストストリームとバイナリストリームを
1789区別するような古いシステムでは、適切に振る舞うようにファイルを
1790取得するためには、不愉快な問題を避けるために懸命な努力が必要です。
1791このような不幸なシステムでは、ソケットとパイプは既にバイナリモードで
1792開いていて、今のところこれをオフにする方法はありません。
1793ファイルに対しては、もっと選択肢があります。
1794
1795=begin original
1796
1797Another option is to use the C<binmode> function on the appropriate
1798handles before doing regular I/O on them:
1799
1800=end original
1801
1802もう一つの選択肢は、通常の I/O を行う前に、適切なファイルハンドルに
1803C<binmode> 関数を使うことです:
1804
1805 binmode(STDIN);
1806 binmode(STDOUT);
1807 while (<STDIN>) { print }
1808
1809=begin original
1810
1811Passing C<sysopen> a non-standard flag option will also open the file in
1812binary mode on those systems that support it. This is the equivalent of
1813opening the file normally, then calling C<binmode> on the handle.
1814
1815=end original
1816
1817C<sysopen> に非標準フラグオプションを渡すことでも、そのような
1818システムでバイナリモードでファイルを開けます。
1819これは、ファイルを普通に開いてから、ハンドルに対して C<binmode> を
1820呼び出すのと等価です。
1821
1822 sysopen(BINDAT, "records.data", O_RDWR | O_BINARY)
1823 || die "can't open records.data: $!";
1824
1825=begin original
1826
1827Now you can use C<read> and C<print> on that handle without worrying
1828about the non-standard system I/O library breaking your data. It's not
1829a pretty picture, but then, legacy systems seldom are. CP/M will be
1830with us until the end of days, and after.
1831
1832=end original
1833
1834これで、非標準システム I/O ライブラリがデータを壊す心配なしに
1835ハンドルに対して C<read> と C<print> を使えるようになりました。
1836これは美しい形ではありませんが、レガシーシステムとは大抵そういうものです。
1837CP/M は世界が終わるまで(そしてその後も)我々と共にあるでしょう。
1838
1839=begin original
1840
1841On systems with exotic I/O systems, it turns out that, astonishingly
1842enough, even unbuffered I/O using C<sysread> and C<syswrite> might do
1843sneaky data mutilation behind your back.
1844
1845=end original
1846
1847風変わりな I/O システムを持つシステムでは、驚いたことに、
1848C<sysread> や C<syswrite> を使ったバッファリングしない I/O でさえも
1849背後でこっそりとデータ操作をすることがあります。
1850
1851 while (sysread(WHENCE, $buf, 1024)) {
1852 syswrite(WHITHER, $buf, length($buf));
1853 }
1854
1855=begin original
1856
1857Depending on the vicissitudes of your runtime system, even these calls
1858may need C<binmode> or C<O_BINARY> first. Systems known to be free of
1859such difficulties include Unix, the Mac OS, Plan 9, and Inferno.
1860
1861=end original
1862
1863実行させるシステムの紆余曲折具合によっては、これらのシステムコールですら
1864最初に C<binmode> や C<O_BINARY> が必要かもしれません。
1865このような問題がないと分かっているシステムには Unix, Mac OS, Plan 9,
1866Inferno などがあります。
1867
1868=head2 File Locking
1869
1870(ファイルのロック)
1871
1872=begin original
1873
1874In a multitasking environment, you may need to be careful not to collide
1875with other processes who want to do I/O on the same files as you
1876are working on. You'll often need shared or exclusive locks
1877on files for reading and writing respectively. You might just
1878pretend that only exclusive locks exist.
1879
1880=end original
1881
1882マルチタスク環境では、あなたが触ろうとしているファイルと同じファイルを
1883他のプロセスが衝突しないように気をつける必要があります。
1884しばしば、ファイルを読み込みまたは書き込みするために、それぞれ
1885共有ロックと排他ロックが必要になります。
1886あるいは、単に排他ロックしかないような振りをするかもしれません。
1887
1888=begin original
1889
1890Never use the existence of a file C<-e $file> as a locking indication,
1891because there is a race condition between the test for the existence of
1892the file and its creation. It's possible for another process to create
1893a file in the slice of time between your existence check and your attempt
1894to create the file. Atomicity is critical.
1895
1896=end original
1897
1898決して、ファイルの存在 C<-e $file> をロック指示に使わないでください;
1899なぜならファイルの存在のテストとその作成の間に競合条件があるからです。
1900存在チェックとファイル作成のわずかな間に、他のプロセスがファイルを作る
1901可能性があります。
1902原子性は危機的です。
1903
1904=begin original
1905
1906Perl's most portable locking interface is via the C<flock> function,
1907whose simplicity is emulated on systems that don't directly support it
1908such as SysV or Windows. The underlying semantics may affect how
1909it all works, so you should learn how C<flock> is implemented on your
1910system's port of Perl.
1911
1912=end original
1913
1914Perl でのもっとも移植性のあるロックインターフェースは、
1915C<flock> 関数によるものです; この単純さは、SysV や Windows のような、
1916これに直接対応していないシステムでもエミュレートされています。
1917基礎となる動作はこれがどのように働くかに影響を与えるので、
1918あなたが使うシステムの Perl で C<flock> がどのように実装されているかを
1919学ぶべきです。
1920
1921=begin original
1922
1923File locking I<does not> lock out another process that would like to
1924do I/O. A file lock only locks out others trying to get a lock, not
1925processes trying to do I/O. Because locks are advisory, if one process
1926uses locking and another doesn't, all bets are off.
1927
1928=end original
1929
1930ファイルロックは、他のプロセスが I/O 操作を行うことからロックするもの
1931I<ではありません>。
1932ファイルロックは、他のプロセスの I/O 操作をロックするのではなく、他の
1933プロセスがロックを得ようとすることをロックします。
1934ロックは勧告的なので、あるプロセスがロックを使っていても、他の
1935プロセスがロックを使っていなければ、全ては台無しになります。
1936
1937=begin original
1938
1939By default, the C<flock> call will block until a lock is granted.
1940A request for a shared lock will be granted as soon as there is no
1941exclusive locker. A request for an exclusive lock will be granted as
1942soon as there is no locker of any kind. Locks are on file descriptors,
1943not file names. You can't lock a file until you open it, and you can't
1944hold on to a lock once the file has been closed.
1945
1946=end original
1947
1948デフォルトでは、C<flock> 呼び出しは、ロックが得られるまでブロックします。
1949共有ロック要求は、誰も排他ロックを持っていない状態になれば直ちに
1950受け入れられます。
1951排他ロック要求は、誰もあらゆる種類のロックを守っていない状態になれば
1952与えられます。
1953ロックはファイル名に対してではなく、ファイル記述子について与えられます。
1954ファイルを開かずにファイルをロックすることはできませんし、ファイルを閉じた
1955後もロックを持ったままにすることもできません。
1956
1957=begin original
1958
1959Here's how to get a blocking shared lock on a file, typically used
1960for reading:
1961
1962=end original
1963
1964以下はファイルに対してブロックする共有ロックを得る方法で、
1965典型的には読み込み時に使われます:
1966
1967 use 5.004;
1968 use Fcntl qw(:DEFAULT :flock);
1969 open(FH, "< filename") or die "can't open filename: $!";
1970 flock(FH, LOCK_SH) or die "can't lock filename: $!";
1971 # now read from FH
1972
1973=begin original
1974
1975You can get a non-blocking lock by using C<LOCK_NB>.
1976
1977=end original
1978
1979C<LOCK_NB> を使うことでブロックしないロックも得られます。
1980
1981 flock(FH, LOCK_SH | LOCK_NB)
1982 or die "can't lock filename: $!";
1983
1984=begin original
1985
1986This can be useful for producing more user-friendly behaviour by warning
1987if you're going to be blocking:
1988
1989=end original
1990
1991ブロックするときに警告することで、よりユーザーにやさしい振る舞いを
1992することは有用です:
1993
1994 use 5.004;
1995 use Fcntl qw(:DEFAULT :flock);
1996 open(FH, "< filename") or die "can't open filename: $!";
1997 unless (flock(FH, LOCK_SH | LOCK_NB)) {
1998 $| = 1;
1999 print "Waiting for lock...";
2000 flock(FH, LOCK_SH) or die "can't lock filename: $!";
2001 print "got it.\n"
2002 }
2003 # now read from FH
2004
2005=begin original
2006
2007To get an exclusive lock, typically used for writing, you have to be
2008careful. We C<sysopen> the file so it can be locked before it gets
2009emptied. You can get a nonblocking version using C<LOCK_EX | LOCK_NB>.
2010
2011=end original
2012
2013(典型的には書き込みのために) 排他ロックを得るためには、慎重になる
2014必要があります。
2015空なる前にロックするために、ファイルを C<sysopen> で開きます。
2016C<LOCK_EX | LOCK_NB> を使った非ブロック版も得られます。
2017
2018 use 5.004;
2019 use Fcntl qw(:DEFAULT :flock);
2020 sysopen(FH, "filename", O_WRONLY | O_CREAT)
2021 or die "can't open filename: $!";
2022 flock(FH, LOCK_EX)
2023 or die "can't lock filename: $!";
2024 truncate(FH, 0)
2025 or die "can't truncate filename: $!";
2026 # now write to FH
2027
2028=begin original
2029
2030Finally, due to the uncounted millions who cannot be dissuaded from
2031wasting cycles on useless vanity devices called hit counters, here's
2032how to increment a number in a file safely:
2033
2034=end original
2035
2036最後に、アクセスカウンタと呼ばれる無駄で空虚な装置のために CPU パワーを
2037無駄遣いすることから逃れられない無慮数百万のために、
2038あるファイルの数値を安全に増加させる方法を以下に示します:
2039
2040 use Fcntl qw(:DEFAULT :flock);
2041
2042 sysopen(FH, "numfile", O_RDWR | O_CREAT)
2043 or die "can't open numfile: $!";
2044 # autoflush FH
2045 $ofh = select(FH); $| = 1; select ($ofh);
2046 flock(FH, LOCK_EX)
2047 or die "can't write-lock numfile: $!";
2048
2049 $num = <FH> || 0;
2050 seek(FH, 0, 0)
2051 or die "can't rewind numfile : $!";
2052 print FH $num+1, "\n"
2053 or die "can't write numfile: $!";
2054
2055 truncate(FH, tell(FH))
2056 or die "can't truncate numfile: $!";
2057 close(FH)
2058 or die "can't close numfile: $!";
2059
2060=head2 IO Layers
2061
2062(IO 層)
2063
2064=begin original
2065
2066In Perl 5.8.0 a new I/O framework called "PerlIO" was introduced.
2067This is a new "plumbing" for all the I/O happening in Perl; for the
2068most part everything will work just as it did, but PerlIO also brought
2069in some new features such as the ability to think of I/O as "layers".
2070One I/O layer may in addition to just moving the data also do
2071transformations on the data. Such transformations may include
2072compression and decompression, encryption and decryption, and transforming
2073between various character encodings.
2074
2075=end original
2076
2077Perl 5.8.0 で、"PerlIO" と呼ばれる新しい I/O フレームワークが
2078導入されました。
2079これは Perl で発生する全ての I/O のための新しい「配管」です;
2080ほとんど全ての部分では単に今まで通りに動作しますが、
2081I/O を「層」として考えるための機能のような、新しい要素も導入されています。
2082ある I/O 層は単にデータを移動させるだけでなく、データを変換するかも知れません。
2083このような変換には、圧縮と展開、暗号化と復号化、様々な文字エンコーディング間の
2084変換を含むかも知れません。
2085
2086=begin original
2087
2088Full discussion about the features of PerlIO is out of scope for this
2089tutorial, but here is how to recognize the layers being used:
2090
2091=end original
2092
2093PerlIO の機能に関する完全な議論はこのチュートリアルの対象外ですが、
2094層が使われていることをどうやって認識するかを以下に示します:
2095
2096=over 4
2097
2098=item *
2099
2100=begin original
2101
2102The three-(or more)-argument form of C<open> is being used and the
2103second argument contains something else in addition to the usual
2104C<< '<' >>, C<< '>' >>, C<< '>>' >>, C<< '|' >> and their variants,
2105for example:
2106
2107=end original
2108
21093 (以上) 引数形式の C<open> が使われ、2 番目の引数に通常の
2110C<< '<' >>, C<< '>' >>, C<< '>>' >>, C<< '|' >> およびそのバリエーション
2111以外の何かが含まれている場合; 例えば:
2112
2113 open(my $fh, "<:crlf", $fn);
2114
2115=item *
2116
2117=begin original
2118
2119The two-argument form of C<binmode> is being used, for example
2120
2121=end original
2122
21232 引数形式の C<binmode> が使われている場合; 例えば
2124
2125 binmode($fh, ":encoding(utf16)");
2126
2127=back
2128
2129=begin original
2130
2131For more detailed discussion about PerlIO see L<PerlIO>;
2132for more detailed discussion about Unicode and I/O see L<perluniintro>.
2133
2134=end original
2135
2136PerlIO に関するより詳細な議論については L<PerlIO> を参照してください;
2137Unicode と I/O に関するより詳細な議論については L<perluniintro> を
2138参照してください。
2139
2140=head1 SEE ALSO
2141
2142=begin original
2143
2144The C<open> and C<sysopen> functions in perlfunc(1);
2145the system open(2), dup(2), fopen(3), and fdopen(3) manpages;
2146the POSIX documentation.
2147
2148=end original
2149
2150perlfunc(1) の C<open> 及び C<sysopen> 関数;
2151システムの open(2), dup(2), fopen(3), fdopen(3) の man ページ;
2152POSIX 文書。
2153
2154867=head1 AUTHOR and COPYRIGHT
2155868
2156Copyright 1998 Tom Christiansen.
869Copyright 2013 Tom Christiansen; now maintained by Perl5 Porters
2157870
2158This documentation is free; you can redistribute it and/or modify it
871This documentation is free; you can redistribute it and/or modify it under
2159under the same terms as Perl itself.
872the same terms as Perl itself.
2160873
2161Irrespective of its distribution, all code examples in these files are
2162hereby placed into the public domain. You are permitted and
2163encouraged to use this code in your own programs for fun or for profit
2164as you see fit. A simple comment in the code giving credit would be
2165courteous but is not required.
2166
2167=head1 HISTORY
2168
2169First release: Sat Jan 9 08:09:11 MST 1999
2170
2171874=begin meta
2172875
2173Translate: SHIRAKATA Kentaro <argrath@ub32.org>
876Translate: SHIRAKTA Kentaro <argrath@ub32.org>
2174877Status: completed
2175878
2176879=end meta