Add built local::lib
[catagits/Gitalist.git] / local-lib5 / man / man3 / IPC::Run3.3pm
CommitLineData
3fea05b9 1.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.10)
2.\"
3.\" Standard preamble:
4.\" ========================================================================
5.de Sp \" Vertical space (when we can't use .PP)
6.if t .sp .5v
7.if n .sp
8..
9.de Vb \" Begin verbatim text
10.ft CW
11.nf
12.ne \\$1
13..
14.de Ve \" End verbatim text
15.ft R
16.fi
17..
18.\" Set up some character translations and predefined strings. \*(-- will
19.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
20.\" double quote, and \*(R" will give a right double quote. \*(C+ will
21.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
22.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
23.\" nothing in troff, for use with C<>.
24.tr \(*W-
25.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
26.ie n \{\
27. ds -- \(*W-
28. ds PI pi
29. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
30. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
31. ds L" ""
32. ds R" ""
33. ds C` ""
34. ds C' ""
35'br\}
36.el\{\
37. ds -- \|\(em\|
38. ds PI \(*p
39. ds L" ``
40. ds R" ''
41'br\}
42.\"
43.\" Escape single quotes in literal strings from groff's Unicode transform.
44.ie \n(.g .ds Aq \(aq
45.el .ds Aq '
46.\"
47.\" If the F register is turned on, we'll generate index entries on stderr for
48.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
49.\" entries marked with X<> in POD. Of course, you'll have to process the
50.\" output yourself in some meaningful fashion.
51.ie \nF \{\
52. de IX
53. tm Index:\\$1\t\\n%\t"\\$2"
54..
55. nr % 0
56. rr F
57.\}
58.el \{\
59. de IX
60..
61.\}
62.\"
63.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
64.\" Fear. Run. Save yourself. No user-serviceable parts.
65. \" fudge factors for nroff and troff
66.if n \{\
67. ds #H 0
68. ds #V .8m
69. ds #F .3m
70. ds #[ \f1
71. ds #] \fP
72.\}
73.if t \{\
74. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
75. ds #V .6m
76. ds #F 0
77. ds #[ \&
78. ds #] \&
79.\}
80. \" simple accents for nroff and troff
81.if n \{\
82. ds ' \&
83. ds ` \&
84. ds ^ \&
85. ds , \&
86. ds ~ ~
87. ds /
88.\}
89.if t \{\
90. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
91. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
92. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
93. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
94. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
95. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
96.\}
97. \" troff and (daisy-wheel) nroff accents
98.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
99.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
100.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
101.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
102.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
103.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
104.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
105.ds ae a\h'-(\w'a'u*4/10)'e
106.ds Ae A\h'-(\w'A'u*4/10)'E
107. \" corrections for vroff
108.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
109.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
110. \" for low resolution devices (crt and lpr)
111.if \n(.H>23 .if \n(.V>19 \
112\{\
113. ds : e
114. ds 8 ss
115. ds o a
116. ds d- d\h'-1'\(ga
117. ds D- D\h'-1'\(hy
118. ds th \o'bp'
119. ds Th \o'LP'
120. ds ae ae
121. ds Ae AE
122.\}
123.rm #[ #] #H #V #F C
124.\" ========================================================================
125.\"
126.IX Title "IPC::Run3 3"
127.TH IPC::Run3 3 "2009-05-30" "perl v5.8.7" "User Contributed Perl Documentation"
128.\" For nroff, turn off justification. Always turn off hyphenation; it makes
129.\" way too many mistakes in technical documents.
130.if n .ad l
131.nh
132.SH "NAME"
133IPC::Run3 \- run a subprocess with input/ouput redirection
134.SH "VERSION"
135.IX Header "VERSION"
136version 0.043
137.SH "SYNOPSIS"
138.IX Header "SYNOPSIS"
139.Vb 1
140\& use IPC::Run3; # Exports run3() by default
141\&
142\& run3 \e@cmd, \e$in, \e$out, \e$err;
143.Ve
144.SH "DESCRIPTION"
145.IX Header "DESCRIPTION"
146This module allows you to run a subprocess and redirect stdin, stdout,
147and/or stderr to files and perl data structures. It aims to satisfy 99% of the
148need for using \f(CW\*(C`system\*(C'\fR, \f(CW\*(C`qx\*(C'\fR, and \f(CW\*(C`open3\*(C'\fR
149with a simple, extremely Perlish \s-1API\s0.
150.PP
151Speed, simplicity, and portability are paramount. (That's speed of Perl code;
152which is often much slower than the kind of buffered I/O that this module uses
153to spool input to and output from the child command.)
154.ie n .SS """run3($cmd, $stdin, $stdout, $stderr, \e%options)"""
155.el .SS "\f(CWrun3($cmd, $stdin, $stdout, $stderr, \e%options)\fP"
156.IX Subsection "run3($cmd, $stdin, $stdout, $stderr, %options)"
157All parameters after \f(CW$cmd\fR are optional.
158.PP
159The parameters \f(CW$stdin\fR, \f(CW$stdout\fR and \f(CW$stderr\fR indicate
160how the child's corresponding filehandle
161(\f(CW\*(C`STDIN\*(C'\fR, \f(CW\*(C`STDOUT\*(C'\fR and \f(CW\*(C`STDERR\*(C'\fR, resp.) will be redirected.
162Because the redirects come last, this allows \f(CW\*(C`STDOUT\*(C'\fR and \f(CW\*(C`STDERR\*(C'\fR to default
163to the parent's by just not specifying them \*(-- a common use case.
164.PP
165\&\f(CW\*(C`run3\*(C'\fR throws an exception if the wrapped \f(CW\*(C`system\*(C'\fR call returned \-1
166or anything went wrong with \f(CW\*(C`run3\*(C'\fR's processing of filehandles.
167Otherwise it returns true.
168It leaves \f(CW$?\fR intact for inspection of exit and wait status.
169.PP
170Note that a true return value from \f(CW\*(C`run3\*(C'\fR doesn't mean that the command
171had a successful exit code. Hence you should always check \f(CW$?\fR.
172.PP
173See \*(L"%options\*(R" for an option to handle the case of \f(CW\*(C`system\*(C'\fR
174returning \-1 yourself.
175.PP
176\fI\f(CI$cmd\fI\fR
177.IX Subsection "$cmd"
178.PP
179Usually \f(CW$cmd\fR will be an \s-1ARRAY\s0 reference and the child is invoked via
180.PP
181.Vb 1
182\& system @$cmd;
183.Ve
184.PP
185But \f(CW$cmd\fR may also be a string in which case the child is invoked via
186.PP
187.Vb 1
188\& system $cmd;
189.Ve
190.PP
191(cf. \*(L"system\*(R" in perlfunc for the difference and the pitfalls of using
192the latter form).
193.PP
194\fI\f(CI$stdin\fI, \f(CI$stdout\fI, \f(CI$stderr\fI\fR
195.IX Subsection "$stdin, $stdout, $stderr"
196.PP
197The parameters \f(CW$stdin\fR, \f(CW$stdout\fR and \f(CW$stderr\fR
198can take one of the following forms:
199.ie n .IP """undef"" (or not specified at all)" 4
200.el .IP "\f(CWundef\fR (or not specified at all)" 4
201.IX Item "undef (or not specified at all)"
202The child inherits the corresponding filehandle from the parent.
203.Sp
204.Vb 2
205\& run3 \e@cmd, $stdin; # child writes to same STDOUT and STDERR as parent
206\& run3 \e@cmd, undef, $stdout, $stderr; # child reads from same STDIN as parent
207.Ve
208.ie n .IP """\eundef""" 4
209.el .IP "\f(CW\eundef\fR" 4
210.IX Item "undef"
211The child's filehandle is redirected from or to the
212local equivalent of \f(CW\*(C`/dev/null\*(C'\fR (as returned by
213\&\f(CW\*(C`File::Spec\->devnull()\*(C'\fR).
214.Sp
215.Vb 1
216\& run3 \e@cmd, \eundef, $stdout, $stderr; # child reads from /dev/null
217.Ve
218.IP "a simple scalar" 4
219.IX Item "a simple scalar"
220The parameter is taken to be the name of a file to read from
221or write to. In the latter case, the file will be opened via
222.Sp
223.Vb 1
224\& open FH, ">", ...
225.Ve
226.Sp
227i.e. it is created if it doesn't exist and truncated otherwise.
228Note that the file is opened by the parent which will croak
229in case of failure.
230.Sp
231.Vb 1
232\& run3 \e@cmd, \eundef, "out.txt"; # child writes to file "out.txt"
233.Ve
234.ie n .IP "a filehandle (either a reference to a \s-1GLOB\s0 or an ""IO::Handle"")" 4
235.el .IP "a filehandle (either a reference to a \s-1GLOB\s0 or an \f(CWIO::Handle\fR)" 4
236.IX Item "a filehandle (either a reference to a GLOB or an IO::Handle)"
237The filehandle is inherited by the child.
238.Sp
239.Vb 7
240\& open my $fh, ">", "out.txt";
241\& print $fh "prologue\en";
242\& ...
243\& run3 \e@cmd, \eundef, $fh; # child writes to $fh
244\& ...
245\& print $fh "epilogue\en";
246\& close $fh;
247.Ve
248.IP "a \s-1SCALAR\s0 reference" 4
249.IX Item "a SCALAR reference"
250The referenced scalar is treated as a string to be read from or
251written to. In the latter case, the previous content of the string
252is overwritten.
253.Sp
254.Vb 7
255\& my $out;
256\& run3 \e@cmd, \eundef, \e$out; # child writes into string
257\& run3 \e@cmd, \e<<EOF; # child reads from string (can use "here" notation)
258\& Input
259\& to
260\& child
261\& EOF
262.Ve
263.IP "an \s-1ARRAY\s0 reference" 4
264.IX Item "an ARRAY reference"
265For \f(CW$stdin\fR, the elements of \f(CW@$stdin\fR are simply spooled to the child.
266.Sp
267For \f(CW$stdout\fR or \f(CW$stderr\fR, the child's corresponding file descriptor
268is read line by line (as determined by the current setting of \f(CW$/\fR)
269into \f(CW@$stdout\fR or \f(CW@$stderr\fR, resp. The previous content of the array
270is overwritten.
271.Sp
272.Vb 2
273\& my @lines;
274\& run3 \e@cmd, \eundef, \e@lines; # child writes into array
275.Ve
276.IP "a \s-1CODE\s0 reference" 4
277.IX Item "a CODE reference"
278For \f(CW$stdin\fR, \f(CW&$stdin\fR will be called repeatedly (with no arguments) and
279the return values are spooled to the child. \f(CW&$stdin\fR must signal the end of
280input by returning \f(CW\*(C`undef\*(C'\fR.
281.Sp
282For \f(CW$stdout\fR or \f(CW$stderr\fR, the child's corresponding file descriptor
283is read line by line (as determined by the current setting of \f(CW$/\fR)
284and \f(CW&$stdout\fR or \f(CW&$stderr\fR, resp., is called with the contents of the line.
285Note that there's no end-of-file indication.
286.Sp
287.Vb 4
288\& my $i = 0;
289\& sub producer {
290\& return $i < 10 ? "line".$i++."\en" : undef;
291\& }
292\&
293\& run3 \e@cmd, \e&producer; # child reads 10 lines
294.Ve
295.Sp
296Note that this form of redirecting the child's I/O doesn't imply
297any form of concurrency between parent and child \- \fIrun3()\fR's method of
298operation is the same no matter which form of redirection you specify.
299.PP
300If the same value is passed for \f(CW$stdout\fR and \f(CW$stderr\fR, then the child
301will write both \f(CW\*(C`STDOUT\*(C'\fR and \f(CW\*(C`STDERR\*(C'\fR to the same filehandle.
302In general, this means that
303.PP
304.Vb 2
305\& run3 \e@cmd, \eundef, "foo.txt", "foo.txt";
306\& run3 \e@cmd, \eundef, \e$both, \e$both;
307.Ve
308.PP
309will \s-1DWIM\s0 and pass a single file handle to the child for both \f(CW\*(C`STDOUT\*(C'\fR and
310\&\f(CW\*(C`STDERR\*(C'\fR, collecting all into file \*(L"foo.txt\*(R" or \f(CW$both\fR.
311.PP
312\fI\f(CI\*(C`\e%options\*(C'\fI\fR
313.IX Subsection "%options"
314.PP
315The last parameter, \f(CW\*(C`\e%options\*(C'\fR, must be a hash reference if present.
316.PP
317Currently the following
318keys are supported:
319.ie n .IP """binmode_stdin"", ""binmode_stdout"", ""binmode_stderr""" 4
320.el .IP "\f(CWbinmode_stdin\fR, \f(CWbinmode_stdout\fR, \f(CWbinmode_stderr\fR" 4
321.IX Item "binmode_stdin, binmode_stdout, binmode_stderr"
322The value must a \*(L"layer\*(R" as described in \*(L"binmode\*(R" in perlfunc.
323If specified the corresponding
324parameter \f(CW$stdin\fR, \f(CW$stdout\fR or \f(CW$stderr\fR, resp., operates
325with the given layer.
326.Sp
327For backward compatibility, a true value that doesn't start with \*(L":\*(R"
328(e.g. a number) is interpreted as \*(L":raw\*(R". If the value is false
329or not specified, the default is \*(L":crlf\*(R" on Windows and \*(L":raw\*(R" otherwise.
330.Sp
331Don't expect that values other than the built-in layers \*(L":raw\*(R", \*(L":crlf\*(R",
332and (on newer Perls) \*(L":bytes\*(R", \*(L":utf8\*(R", \*(L":encoding(...)\*(R" will work.
333.ie n .IP """append_stdout"", ""append_stderr""" 4
334.el .IP "\f(CWappend_stdout\fR, \f(CWappend_stderr\fR" 4
335.IX Item "append_stdout, append_stderr"
336If their value is true then the corresponding
337parameter \f(CW$stdout\fR or \f(CW$stderr\fR, resp., will append the child's output
338to the existing \*(L"contents\*(R" of the redirector. This only makes
339sense if the redirector is a simple scalar (the corresponding file
340is opened in append mode), a \s-1SCALAR\s0 reference (the output is
341appended to the previous contents of the string)
342or an \s-1ARRAY\s0 reference (the output is \f(CW\*(C`push\*(C'\fRed onto the
343previous contents of the array).
344.ie n .IP """return_if_system_error""" 4
345.el .IP "\f(CWreturn_if_system_error\fR" 4
346.IX Item "return_if_system_error"
347If this is true \f(CW\*(C`run3\*(C'\fR does \fBnot\fR throw an exception if \f(CW\*(C`system\*(C'\fR
348returns \-1 (cf. \*(L"system\*(R" in perlfunc for possible
349failure scenarios.), but returns true instead.
350In this case \f(CW$?\fR has the value \-1 and \f(CW$!\fR
351contains the errno of the failing \f(CW\*(C`system\*(C'\fR call.
352.SH "HOW IT WORKS"
353.IX Header "HOW IT WORKS"
354.IP "(1)" 4
355.IX Item "(1)"
356For each redirector \f(CW$stdin\fR, \f(CW$stdout\fR, and \f(CW$stderr\fR,
357\&\f(CW\*(C`run3()\*(C'\fR furnishes a filehandle:
358.RS 4
359.IP "\(bu" 4
360if the redirector already specifies a filehandle it just uses that
361.IP "\(bu" 4
362if the redirector specifies a filename, \f(CW\*(C`run3()\*(C'\fR opens the file
363in the appropriate mode
364.IP "\(bu" 4
365in all other cases, \f(CW\*(C`run3()\*(C'\fR opens a temporary file
366(using tempfile)
367.RE
368.RS 4
369.RE
370.IP "(2)" 4
371.IX Item "(2)"
372If \f(CW\*(C`run3()\*(C'\fR opened a temporary file for \f(CW$stdin\fR in step (1),
373it writes the data using the specified method (either
374from a string, an array or returnd by a function) to the temporary file and rewinds it.
375.IP "(3)" 4
376.IX Item "(3)"
377\&\f(CW\*(C`run3()\*(C'\fR saves the parent's \f(CW\*(C`STDIN\*(C'\fR, \f(CW\*(C`STDOUT\*(C'\fR and \f(CW\*(C`STDERR\*(C'\fR by duplicating
378them to new filehandles. It duplicates the filehandles from step (1)
379to \f(CW\*(C`STDIN\*(C'\fR, \f(CW\*(C`STDOUT\*(C'\fR and \f(CW\*(C`STDERR\*(C'\fR, resp.
380.IP "(4)" 4
381.IX Item "(4)"
382\&\f(CW\*(C`run3()\*(C'\fR runs the child by invoking system
383with \f(CW$cmd\fR as specified above.
384.IP "(5)" 4
385.IX Item "(5)"
386\&\f(CW\*(C`run3()\*(C'\fR restores the parent's \f(CW\*(C`STDIN\*(C'\fR, \f(CW\*(C`STDOUT\*(C'\fR and \f(CW\*(C`STDERR\*(C'\fR saved in step (3).
387.IP "(6)" 4
388.IX Item "(6)"
389If \f(CW\*(C`run3()\*(C'\fR opened a temporary file for \f(CW$stdout\fR or \f(CW$stderr\fR in step (1),
390it rewinds it and reads back its contents using the specified method
391(either to a string, an array or by calling a function).
392.IP "(7)" 4
393.IX Item "(7)"
394\&\f(CW\*(C`run3()\*(C'\fR closes all filehandles that it opened explicitly in step (1).
395.PP
396Note that when using temporary files, \f(CW\*(C`run3()\*(C'\fR tries to amortize the overhead
397by reusing them (i.e. it keeps them open and rewinds and truncates them
398before the next operation).
399.SH "LIMITATIONS"
400.IX Header "LIMITATIONS"
401Often uses intermediate files (determined by File::Temp, and thus by the
402File::Spec defaults and the \s-1TMPDIR\s0 env. variable) for speed, portability and
403simplicity.
404.PP
405Use extrem caution when using \f(CW\*(C`run3\*(C'\fR in a threaded environment if
406concurrent calls of \f(CW\*(C`run3\*(C'\fR are possible. Most likely, I/O from different
407invocations will get mixed up. The reason is that in most thread
408implementations all threads in a process share the same \s-1STDIN/STDOUT/STDERR\s0.
409Known failures are Perl ithreads on Linux and Win32. Note that \f(CW\*(C`fork\*(C'\fR
410on Win32 is emulated via Win32 threads and hence I/O mix up is possible
411between forked children here (\f(CW\*(C`run3\*(C'\fR is \*(L"fork safe\*(R" on Unix, though).
412.SH "DEBUGGING"
413.IX Header "DEBUGGING"
414To enable debugging use the \s-1IPCRUN3DEBUG\s0 environment variable to
415a non-zero integer value:
416.PP
417.Vb 1
418\& $ IPCRUN3DEBUG=1 myapp
419.Ve
420.SH "PROFILING"
421.IX Header "PROFILING"
422To enable profiling, set \s-1IPCRUN3PROFILE\s0 to a number to enable emitting profile
423information to \s-1STDERR\s0 (1 to get timestamps, 2 to get a summary report at the
424\&\s-1END\s0 of the program, 3 to get mini reports after each run) or to a filename to
425emit raw data to a file for later analysis.
426.SH "COMPARISON"
427.IX Header "COMPARISON"
428Here's how it stacks up to existing APIs:
429.ie n .SS "compared to ""system()"", ""qx\*(Aq\*(Aq"", ""open ""...|"""", ""open ""|..."""""
430.el .SS "compared to \f(CWsystem()\fP, \f(CWqx\*(Aq\*(Aq\fP, \f(CWopen ``...|''\fP, \f(CWopen ``|...''\fP"
431.IX Subsection "compared to system(), qx, open ""...|"", open ""|..."""
432.IP "+" 4
433redirects more than one file descriptor
434.IP "+" 4
435returns \s-1TRUE\s0 on success, \s-1FALSE\s0 on failure
436.IP "+" 4
437throws an error if problems occur in the parent process (or the pre-exec child)
438.IP "+" 4
439allows a very perlish interface to Perl data structures and subroutines
440.IP "+" 4
441allows 1 word invocations to avoid the shell easily:
442.Sp
443.Vb 1
444\& run3 ["foo"]; # does not invoke shell
445.Ve
446.IP "\-" 4
447does not return the exit code, leaves it in $?
448.ie n .SS "compared to ""open2()"", ""open3()"""
449.el .SS "compared to \f(CWopen2()\fP, \f(CWopen3()\fP"
450.IX Subsection "compared to open2(), open3()"
451.IP "+" 4
452no lengthy, error prone polling/select loop needed
453.IP "+" 4
454hides \s-1OS\s0 dependancies
455.IP "+" 4
456allows \s-1SCALAR\s0, \s-1ARRAY\s0, and \s-1CODE\s0 references to source and sink I/O
457.IP "+" 4
458I/O parameter order is like \f(CW\*(C`open3()\*(C'\fR (not like \f(CW\*(C`open2()\*(C'\fR).
459.IP "\-" 4
460does not allow interaction with the subprocess
461.SS "compared to \fIIPC::Run::run()\fP"
462.IX Subsection "compared to IPC::Run::run()"
463.IP "+" 4
464smaller, lower overhead, simpler, more portable
465.IP "+" 4
466no \fIselect()\fR loop portability issues
467.IP "+" 4
468does not fall prey to Perl closure leaks
469.IP "\-" 4
470does not allow interaction with the subprocess (which
471\&\fIIPC::Run::run()\fR allows by redirecting subroutines)
472.IP "\-" 4
473lacks many features of \f(CW\*(C`IPC::Run::run()\*(C'\fR (filters, pipes,
474redirects, pty support)
475.SH "COPYRIGHT"
476.IX Header "COPYRIGHT"
477Copyright 2003, R. Barrie Slaymaker, Jr., All Rights Reserved
478.SH "LICENSE"
479.IX Header "LICENSE"
480You may use this module under the terms of the \s-1BSD\s0, Artistic, or \s-1GPL\s0 licenses,
481any version.
482.SH "AUTHOR"
483.IX Header "AUTHOR"
484Barrie Slaymaker <\f(CW\*(C`barries@slaysys.com\*(C'\fR>
485.PP
486Ricardo \s-1SIGNES\s0 <\f(CW\*(C`rjbs@cpan.org\*(C'\fR> performed some routine maintenance in
4872005, thanks to help from the following ticket and/or patch submitters: Jody
488Belka, Roderich Schupp, David Morel, and anonymous others.