Add built local::lib
[catagits/Gitalist.git] / local-lib5 / man / man3 / File::GlobMapper.3pm
CommitLineData
3fea05b9 1.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.3
2.\"
3.\" Standard preamble:
4.\" ========================================================================
5.de Sh \" Subsection heading
6.br
7.if t .Sp
8.ne 5
9.PP
10\fB\\$1\fR
11.PP
12..
13.de Sp \" Vertical space (when we can't use .PP)
14.if t .sp .5v
15.if n .sp
16..
17.de Vb \" Begin verbatim text
18.ft CW
19.nf
20.ne \\$1
21..
22.de Ve \" End verbatim text
23.ft R
24.fi
25..
26.\" Set up some character translations and predefined strings. \*(-- will
27.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
28.\" double quote, and \*(R" will give a right double quote. | will give a
29.\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used to
30.\" do unbreakable dashes and therefore won't be available. \*(C` and \*(C'
31.\" expand to `' in nroff, nothing in troff, for use with C<>.
32.tr \(*W-|\(bv\*(Tr
33.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
34.ie n \{\
35. ds -- \(*W-
36. ds PI pi
37. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
38. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
39. ds L" ""
40. ds R" ""
41. ds C` ""
42. ds C' ""
43'br\}
44.el\{\
45. ds -- \|\(em\|
46. ds PI \(*p
47. ds L" ``
48. ds R" ''
49'br\}
50.\"
51.\" If the F register is turned on, we'll generate index entries on stderr for
52.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
53.\" entries marked with X<> in POD. Of course, you'll have to process the
54.\" output yourself in some meaningful fashion.
55.if \nF \{\
56. de IX
57. tm Index:\\$1\t\\n%\t"\\$2"
58..
59. nr % 0
60. rr F
61.\}
62.\"
63.\" For nroff, turn off justification. Always turn off hyphenation; it makes
64.\" way too many mistakes in technical documents.
65.hy 0
66.if n .na
67.\"
68.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
69.\" Fear. Run. Save yourself. No user-serviceable parts.
70. \" fudge factors for nroff and troff
71.if n \{\
72. ds #H 0
73. ds #V .8m
74. ds #F .3m
75. ds #[ \f1
76. ds #] \fP
77.\}
78.if t \{\
79. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
80. ds #V .6m
81. ds #F 0
82. ds #[ \&
83. ds #] \&
84.\}
85. \" simple accents for nroff and troff
86.if n \{\
87. ds ' \&
88. ds ` \&
89. ds ^ \&
90. ds , \&
91. ds ~ ~
92. ds /
93.\}
94.if t \{\
95. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
96. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
97. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
98. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
99. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
100. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
101.\}
102. \" troff and (daisy-wheel) nroff accents
103.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
104.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
105.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
106.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
107.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
108.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
109.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
110.ds ae a\h'-(\w'a'u*4/10)'e
111.ds Ae A\h'-(\w'A'u*4/10)'E
112. \" corrections for vroff
113.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
114.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
115. \" for low resolution devices (crt and lpr)
116.if \n(.H>23 .if \n(.V>19 \
117\{\
118. ds : e
119. ds 8 ss
120. ds o a
121. ds d- d\h'-1'\(ga
122. ds D- D\h'-1'\(hy
123. ds th \o'bp'
124. ds Th \o'LP'
125. ds ae ae
126. ds Ae AE
127.\}
128.rm #[ #] #H #V #F C
129.\" ========================================================================
130.\"
131.IX Title "File::GlobMapper 3"
132.TH File::GlobMapper 3 "2009-02-04" "perl v5.8.7" "User Contributed Perl Documentation"
133.SH "NAME"
134File::GlobMapper \- Extend File Glob to Allow Input and Output Files
135.SH "SYNOPSIS"
136.IX Header "SYNOPSIS"
137.Vb 1
138\& use File::GlobMapper qw( globmap );
139.Ve
140.PP
141.Vb 2
142\& my $aref = globmap $input => $output
143\& or die $File::GlobMapper::Error ;
144.Ve
145.PP
146.Vb 2
147\& my $gm = new File::GlobMapper $input => $output
148\& or die $File::GlobMapper::Error ;
149.Ve
150.SH "DESCRIPTION"
151.IX Header "DESCRIPTION"
152This module needs Perl5.005 or better.
153.PP
154This module takes the existing \f(CW\*(C`File::Glob\*(C'\fR module as a starting point and
155extends it to allow new filenames to be derived from the files matched by
156\&\f(CW\*(C`File::Glob\*(C'\fR.
157.PP
158This can be useful when carrying out batch operations on multiple files that
159have both an input filename and output filename and the output file can be
160derived from the input filename. Examples of operations where this can be
161useful include, file renaming, file copying and file compression.
162.Sh "Behind The Scenes"
163.IX Subsection "Behind The Scenes"
164To help explain what \f(CW\*(C`File::GlobMapper\*(C'\fR does, consider what code you
165would write if you wanted to rename all files in the current directory
166that ended in \f(CW\*(C`.tar.gz\*(C'\fR to \f(CW\*(C`.tgz\*(C'\fR. So say these files are in the
167current directory
168.PP
169.Vb 3
170\& alpha.tar.gz
171\& beta.tar.gz
172\& gamma.tar.gz
173.Ve
174.PP
175and they need renamed to this
176.PP
177.Vb 3
178\& alpha.tgz
179\& beta.tgz
180\& gamma.tgz
181.Ve
182.PP
183Below is a possible implementation of a script to carry out the rename
184(error cases have been omitted)
185.PP
186.Vb 4
187\& foreach my $old ( glob "*.tar.gz" )
188\& {
189\& my $new = $old;
190\& $new =~ s#(.*)\e.tar\e.gz$#$1.tgz# ;
191.Ve
192.PP
193.Vb 3
194\& rename $old => $new
195\& or die "Cannot rename '$old' to '$new': $!\en;
196\& }
197.Ve
198.PP
199Notice that a file glob pattern \f(CW\*(C`*.tar.gz\*(C'\fR was used to match the
200\&\f(CW\*(C`.tar.gz\*(C'\fR files, then a fairly similar regular expression was used in
201the substitute to allow the new filename to be created.
202.PP
203Given that the file glob is just a cut-down regular expression and that it
204has already done a lot of the hard work in pattern matching the filenames,
205wouldn't it be handy to be able to use the patterns in the fileglob to
206drive the new filename?
207.PP
208Well, that's \fIexactly\fR what \f(CW\*(C`File::GlobMapper\*(C'\fR does.
209.PP
210Here is same snippet of code rewritten using \f(CW\*(C`globmap\*(C'\fR
211.PP
212.Vb 6
213\& for my $pair (globmap '<*.tar.gz>' => '<#1.tgz>' )
214\& {
215\& my ($from, $to) = @$pair;
216\& rename $from => $to
217\& or die "Cannot rename '$old' to '$new': $!\en;
218\& }
219.Ve
220.PP
221So how does it work?
222.PP
223Behind the scenes the \f(CW\*(C`globmap\*(C'\fR function does a combination of a
224file glob to match existing filenames followed by a substitute
225to create the new filenames.
226.PP
227Notice how both parameters to \f(CW\*(C`globmap\*(C'\fR are strings that are delimited by <>.
228This is done to make them look more like file globs \- it is just syntactic
229sugar, but it can be handy when you want the strings to be visually
230distinctive. The enclosing <> are optional, so you don't have to use them \- in
231fact the first thing globmap will do is remove these delimiters if they are
232present.
233.PP
234The first parameter to \f(CW\*(C`globmap\*(C'\fR, \f(CW\*(C`*.tar.gz\*(C'\fR, is an \fIInput File Glob\fR.
235Once the enclosing \*(L"< ... >\*(R" is removed, this is passed (more or
236less) unchanged to \f(CW\*(C`File::Glob\*(C'\fR to carry out a file match.
237.PP
238Next the fileglob \f(CW\*(C`*.tar.gz\*(C'\fR is transformed behind the scenes into a
239full Perl regular expression, with the additional step of wrapping each
240transformed wildcard metacharacter sequence in parenthesis.
241.PP
242In this case the input fileglob \f(CW\*(C`*.tar.gz\*(C'\fR will be transformed into
243this Perl regular expression
244.PP
245.Vb 1
246\& ([^/]*)\e.tar\e.gz
247.Ve
248.PP
249Wrapping with parenthesis allows the wildcard parts of the Input File
250Glob to be referenced by the second parameter to \f(CW\*(C`globmap\*(C'\fR, \f(CW\*(C`#1.tgz\*(C'\fR,
251the \fIOutput File Glob\fR. This parameter operates just like the replacement
252part of a substitute command. The difference is that the \f(CW\*(C`#1\*(C'\fR syntax
253is used to reference sub-patterns matched in the input fileglob, rather
254than the \f(CW$1\fR syntax that is used with perl regular expressions. In
255this case \f(CW\*(C`#1\*(C'\fR is used to refer to the text matched by the \f(CW\*(C`*\*(C'\fR in the
256Input File Glob. This makes it easier to use this module where the
257parameters to \f(CW\*(C`globmap\*(C'\fR are typed at the command line.
258.PP
259The final step involves passing each filename matched by the \f(CW\*(C`*.tar.gz\*(C'\fR
260file glob through the derived Perl regular expression in turn and
261expanding the output fileglob using it.
262.PP
263The end result of all this is a list of pairs of filenames. By default
264that is what is returned by \f(CW\*(C`globmap\*(C'\fR. In this example the data structure
265returned will look like this
266.PP
267.Vb 4
268\& ( ['alpha.tar.gz' => 'alpha.tgz'],
269\& ['beta.tar.gz' => 'beta.tgz' ],
270\& ['gamma.tar.gz' => 'gamma.tgz']
271\& )
272.Ve
273.PP
274Each pair is an array reference with two elements \- namely the \fIfrom\fR
275filename, that \f(CW\*(C`File::Glob\*(C'\fR has matched, and a \fIto\fR filename that is
276derived from the \fIfrom\fR filename.
277.Sh "Limitations"
278.IX Subsection "Limitations"
279\&\f(CW\*(C`File::GlobMapper\*(C'\fR has been kept simple deliberately, so it isn't intended to
280solve all filename mapping operations. Under the hood \f(CW\*(C`File::Glob\*(C'\fR (or for
281older versions of Perl, \f(CW\*(C`File::BSDGlob\*(C'\fR) is used to match the files, so you
282will never have the flexibility of full Perl regular expression.
283.Sh "Input File Glob"
284.IX Subsection "Input File Glob"
285The syntax for an Input FileGlob is identical to \f(CW\*(C`File::Glob\*(C'\fR, except
286for the following
287.IP "1." 5
288No nested {}
289.IP "2." 5
290Whitespace does not delimit fileglobs.
291.IP "3." 5
292The use of parenthesis can be used to capture parts of the input filename.
293.IP "4." 5
294If an Input glob matches the same file more than once, only the first
295will be used.
296.PP
297The syntax
298.IP "\fB~\fR" 5
299.IX Item "~"
300.PD 0
301.IP "\fB~user\fR" 5
302.IX Item "~user"
303.IP "\fB.\fR" 5
304.IX Item "."
305.PD
306Matches a literal '.'.
307Equivalent to the Perl regular expression
308.Sp
309.Vb 1
310\& \e.
311.Ve
312.IP "\fB*\fR" 5
313.IX Item "*"
314Matches zero or more characters, except '/'. Equivalent to the Perl
315regular expression
316.Sp
317.Vb 1
318\& [^/]*
319.Ve
320.IP "\fB?\fR" 5
321.IX Item "?"
322Matches zero or one character, except '/'. Equivalent to the Perl
323regular expression
324.Sp
325.Vb 1
326\& [^/]?
327.Ve
328.IP "\fB\e\fR" 5
329.IX Item ""
330Backslash is used, as usual, to escape the next character.
331.IP "\fB[]\fR" 5
332.IX Item "[]"
333Character class.
334.IP "\fB{,}\fR" 5
335.IX Item "{,}"
336Alternation
337.IP "\fB()\fR" 5
338.IX Item "()"
339Capturing parenthesis that work just like perl
340.PP
341Any other character it taken literally.
342.Sh "Output File Glob"
343.IX Subsection "Output File Glob"
344The Output File Glob is a normal string, with 2 glob-like features.
345.PP
346The first is the '*' metacharacter. This will be replaced by the complete
347filename matched by the input file glob. So
348.PP
349.Vb 1
350\& *.c *.Z
351.Ve
352.PP
353The second is
354.PP
355Output FileGlobs take the
356.ie n .IP """*""" 5
357.el .IP "``*''" 5
358.IX Item "*"
359The \*(L"*\*(R" character will be replaced with the complete input filename.
360.IP "#1" 5
361.IX Item "#1"
362Patterns of the form /#\ed/ will be replaced with the
363.Sh "Returned Data"
364.IX Subsection "Returned Data"
365.SH "EXAMPLES"
366.IX Header "EXAMPLES"
367.Sh "A Rename script"
368.IX Subsection "A Rename script"
369Below is a simple \*(L"rename\*(R" script that uses \f(CW\*(C`globmap\*(C'\fR to determine the
370source and destination filenames.
371.PP
372.Vb 2
373\& use File::GlobMapper qw(globmap) ;
374\& use File::Copy;
375.Ve
376.PP
377.Vb 2
378\& die "rename: Usage rename 'from' 'to'\en"
379\& unless @ARGV == 2 ;
380.Ve
381.PP
382.Vb 2
383\& my $fromGlob = shift @ARGV;
384\& my $toGlob = shift @ARGV;
385.Ve
386.PP
387.Vb 2
388\& my $pairs = globmap($fromGlob, $toGlob)
389\& or die $File::GlobMapper::Error;
390.Ve
391.PP
392.Vb 5
393\& for my $pair (@$pairs)
394\& {
395\& my ($from, $to) = @$pair;
396\& move $from => $to ;
397\& }
398.Ve
399.PP
400Here is an example that renames all c files to cpp.
401.PP
402.Vb 1
403\& $ rename '*.c' '#1.cpp'
404.Ve
405.Sh "A few example globmaps"
406.IX Subsection "A few example globmaps"
407Below are a few examples of globmaps
408.PP
409To copy all your .c file to a backup directory
410.PP
411.Vb 1
412\& '</my/home/*.c>' '</my/backup/#1.c>'
413.Ve
414.PP
415If you want to compress all
416.PP
417.Vb 1
418\& '</my/home/*.[ch]>' '<*.gz>'
419.Ve
420.PP
421To uncompress
422.PP
423.Vb 1
424\& '</my/home/*.[ch].gz>' '</my/home/#1.#2>'
425.Ve
426.SH "SEE ALSO"
427.IX Header "SEE ALSO"
428File::Glob
429.SH "AUTHOR"
430.IX Header "AUTHOR"
431The \fIFile::GlobMapper\fR module was written by Paul Marquess, \fIpmqs@cpan.org\fR.
432.SH "COPYRIGHT AND LICENSE"
433.IX Header "COPYRIGHT AND LICENSE"
434Copyright (c) 2005 Paul Marquess. All rights reserved.
435This program is free software; you can redistribute it and/or
436modify it under the same terms as Perl itself.