summaryrefslogtreecommitdiffstats
path: root/upstream/mageia-cauldron/man3pm/File::GlobMapper.3pm
diff options
context:
space:
mode:
Diffstat (limited to 'upstream/mageia-cauldron/man3pm/File::GlobMapper.3pm')
-rw-r--r--upstream/mageia-cauldron/man3pm/File::GlobMapper.3pm350
1 files changed, 350 insertions, 0 deletions
diff --git a/upstream/mageia-cauldron/man3pm/File::GlobMapper.3pm b/upstream/mageia-cauldron/man3pm/File::GlobMapper.3pm
new file mode 100644
index 00000000..2cbbe5e3
--- /dev/null
+++ b/upstream/mageia-cauldron/man3pm/File::GlobMapper.3pm
@@ -0,0 +1,350 @@
+.\" -*- mode: troff; coding: utf-8 -*-
+.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
+.ie n \{\
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is >0, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\" ========================================================================
+.\"
+.IX Title "File::GlobMapper 3pm"
+.TH File::GlobMapper 3pm 2023-11-28 "perl v5.38.2" "Perl Programmers Reference Guide"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH NAME
+File::GlobMapper \- Extend File Glob to Allow Input and Output Files
+.SH SYNOPSIS
+.IX Header "SYNOPSIS"
+.Vb 1
+\& use File::GlobMapper qw( globmap );
+\&
+\& my $aref = globmap $input => $output
+\& or die $File::GlobMapper::Error ;
+\&
+\& my $gm = File::GlobMapper\->new( $input => $output )
+\& or die $File::GlobMapper::Error ;
+.Ve
+.SH DESCRIPTION
+.IX Header "DESCRIPTION"
+This module needs Perl5.005 or better.
+.PP
+This module takes the existing \f(CW\*(C`File::Glob\*(C'\fR module as a starting point and
+extends it to allow new filenames to be derived from the files matched by
+\&\f(CW\*(C`File::Glob\*(C'\fR.
+.PP
+This can be useful when carrying out batch operations on multiple files that
+have both an input filename and output filename and the output file can be
+derived from the input filename. Examples of operations where this can be
+useful include, file renaming, file copying and file compression.
+.SS "Behind The Scenes"
+.IX Subsection "Behind The Scenes"
+To help explain what \f(CW\*(C`File::GlobMapper\*(C'\fR does, consider what code you
+would write if you wanted to rename all files in the current directory
+that ended in \f(CW\*(C`.tar.gz\*(C'\fR to \f(CW\*(C`.tgz\*(C'\fR. So say these files are in the
+current directory
+.PP
+.Vb 3
+\& alpha.tar.gz
+\& beta.tar.gz
+\& gamma.tar.gz
+.Ve
+.PP
+and they need renamed to this
+.PP
+.Vb 3
+\& alpha.tgz
+\& beta.tgz
+\& gamma.tgz
+.Ve
+.PP
+Below is a possible implementation of a script to carry out the rename
+(error cases have been omitted)
+.PP
+.Vb 4
+\& foreach my $old ( glob "*.tar.gz" )
+\& {
+\& my $new = $old;
+\& $new =~ s#(.*)\e.tar\e.gz$#$1.tgz# ;
+\&
+\& rename $old => $new
+\& or die "Cannot rename \*(Aq$old\*(Aq to \*(Aq$new\*(Aq: $!\en;
+\& }
+.Ve
+.PP
+Notice that a file glob pattern \f(CW\*(C`*.tar.gz\*(C'\fR was used to match the
+\&\f(CW\*(C`.tar.gz\*(C'\fR files, then a fairly similar regular expression was used in
+the substitute to allow the new filename to be created.
+.PP
+Given that the file glob is just a cut-down regular expression and that it
+has already done a lot of the hard work in pattern matching the filenames,
+wouldn't it be handy to be able to use the patterns in the fileglob to
+drive the new filename?
+.PP
+Well, that's \fIexactly\fR what \f(CW\*(C`File::GlobMapper\*(C'\fR does.
+.PP
+Here is same snippet of code rewritten using \f(CW\*(C`globmap\*(C'\fR
+.PP
+.Vb 6
+\& for my $pair (globmap \*(Aq<*.tar.gz>\*(Aq => \*(Aq<#1.tgz>\*(Aq )
+\& {
+\& my ($from, $to) = @$pair;
+\& rename $from => $to
+\& or die "Cannot rename \*(Aq$old\*(Aq to \*(Aq$new\*(Aq: $!\en;
+\& }
+.Ve
+.PP
+So how does it work?
+.PP
+Behind the scenes the \f(CW\*(C`globmap\*(C'\fR function does a combination of a
+file glob to match existing filenames followed by a substitute
+to create the new filenames.
+.PP
+Notice how both parameters to \f(CW\*(C`globmap\*(C'\fR are strings that are delimited by <>.
+This is done to make them look more like file globs \- it is just syntactic
+sugar, but it can be handy when you want the strings to be visually
+distinctive. The enclosing <> are optional, so you don't have to use them \- in
+fact the first thing globmap will do is remove these delimiters if they are
+present.
+.PP
+The first parameter to \f(CW\*(C`globmap\*(C'\fR, \f(CW\*(C`*.tar.gz\*(C'\fR, is an \fIInput File Glob\fR.
+Once the enclosing "< ... >" is removed, this is passed (more or
+less) unchanged to \f(CW\*(C`File::Glob\*(C'\fR to carry out a file match.
+.PP
+Next the fileglob \f(CW\*(C`*.tar.gz\*(C'\fR is transformed behind the scenes into a
+full Perl regular expression, with the additional step of wrapping each
+transformed wildcard metacharacter sequence in parenthesis.
+.PP
+In this case the input fileglob \f(CW\*(C`*.tar.gz\*(C'\fR will be transformed into
+this Perl regular expression
+.PP
+.Vb 1
+\& ([^/]*)\e.tar\e.gz
+.Ve
+.PP
+Wrapping with parenthesis allows the wildcard parts of the Input File
+Glob to be referenced by the second parameter to \f(CW\*(C`globmap\*(C'\fR, \f(CW\*(C`#1.tgz\*(C'\fR,
+the \fIOutput File Glob\fR. This parameter operates just like the replacement
+part of a substitute command. The difference is that the \f(CW\*(C`#1\*(C'\fR syntax
+is used to reference sub-patterns matched in the input fileglob, rather
+than the \f(CW$1\fR syntax that is used with perl regular expressions. In
+this case \f(CW\*(C`#1\*(C'\fR is used to refer to the text matched by the \f(CW\*(C`*\*(C'\fR in the
+Input File Glob. This makes it easier to use this module where the
+parameters to \f(CW\*(C`globmap\*(C'\fR are typed at the command line.
+.PP
+The final step involves passing each filename matched by the \f(CW\*(C`*.tar.gz\*(C'\fR
+file glob through the derived Perl regular expression in turn and
+expanding the output fileglob using it.
+.PP
+The end result of all this is a list of pairs of filenames. By default
+that is what is returned by \f(CW\*(C`globmap\*(C'\fR. In this example the data structure
+returned will look like this
+.PP
+.Vb 4
+\& ( [\*(Aqalpha.tar.gz\*(Aq => \*(Aqalpha.tgz\*(Aq],
+\& [\*(Aqbeta.tar.gz\*(Aq => \*(Aqbeta.tgz\*(Aq ],
+\& [\*(Aqgamma.tar.gz\*(Aq => \*(Aqgamma.tgz\*(Aq]
+\& )
+.Ve
+.PP
+Each pair is an array reference with two elements \- namely the \fIfrom\fR
+filename, that \f(CW\*(C`File::Glob\*(C'\fR has matched, and a \fIto\fR filename that is
+derived from the \fIfrom\fR filename.
+.SS Limitations
+.IX Subsection "Limitations"
+\&\f(CW\*(C`File::GlobMapper\*(C'\fR has been kept simple deliberately, so it isn't intended to
+solve all filename mapping operations. Under the hood \f(CW\*(C`File::Glob\*(C'\fR (or for
+older versions of Perl, \f(CW\*(C`File::BSDGlob\*(C'\fR) is used to match the files, so you
+will never have the flexibility of full Perl regular expression.
+.SS "Input File Glob"
+.IX Subsection "Input File Glob"
+The syntax for an Input FileGlob is identical to \f(CW\*(C`File::Glob\*(C'\fR, except
+for the following
+.IP 1. 5
+No nested {}
+.IP 2. 5
+Whitespace does not delimit fileglobs.
+.IP 3. 5
+The use of parenthesis can be used to capture parts of the input filename.
+.IP 4. 5
+If an Input glob matches the same file more than once, only the first
+will be used.
+.PP
+The syntax
+.IP \fB~\fR 5
+.IX Item "~"
+.PD 0
+.IP \fB~user\fR 5
+.IX Item "~user"
+.IP \fB.\fR 5
+.IX Item "."
+.PD
+Matches a literal '.'.
+Equivalent to the Perl regular expression
+.Sp
+.Vb 1
+\& \e.
+.Ve
+.IP \fB*\fR 5
+.IX Item "*"
+Matches zero or more characters, except '/'. Equivalent to the Perl
+regular expression
+.Sp
+.Vb 1
+\& [^/]*
+.Ve
+.IP \fB?\fR 5
+.IX Item "?"
+Matches zero or one character, except '/'. Equivalent to the Perl
+regular expression
+.Sp
+.Vb 1
+\& [^/]?
+.Ve
+.IP \fB\e\fR 5
+.IX Item ""
+Backslash is used, as usual, to escape the next character.
+.IP \fB[]\fR 5
+.IX Item "[]"
+Character class.
+.IP \fB{,}\fR 5
+.IX Item "{,}"
+Alternation
+.IP \fB()\fR 5
+.IX Item "()"
+Capturing parenthesis that work just like perl
+.PP
+Any other character it taken literally.
+.SS "Output File Glob"
+.IX Subsection "Output File Glob"
+The Output File Glob is a normal string, with 2 glob-like features.
+.PP
+The first is the '*' metacharacter. This will be replaced by the complete
+filename matched by the input file glob. So
+.PP
+.Vb 1
+\& *.c *.Z
+.Ve
+.PP
+The second is
+.PP
+Output FileGlobs take the
+.IP """*""" 5
+The "*" character will be replaced with the complete input filename.
+.IP #1 5
+.IX Item "#1"
+Patterns of the form /#\ed/ will be replaced with the
+.SS "Returned Data"
+.IX Subsection "Returned Data"
+.SH EXAMPLES
+.IX Header "EXAMPLES"
+.SS "A Rename script"
+.IX Subsection "A Rename script"
+Below is a simple "rename" script that uses \f(CW\*(C`globmap\*(C'\fR to determine the
+source and destination filenames.
+.PP
+.Vb 2
+\& use File::GlobMapper qw(globmap) ;
+\& use File::Copy;
+\&
+\& die "rename: Usage rename \*(Aqfrom\*(Aq \*(Aqto\*(Aq\en"
+\& unless @ARGV == 2 ;
+\&
+\& my $fromGlob = shift @ARGV;
+\& my $toGlob = shift @ARGV;
+\&
+\& my $pairs = globmap($fromGlob, $toGlob)
+\& or die $File::GlobMapper::Error;
+\&
+\& for my $pair (@$pairs)
+\& {
+\& my ($from, $to) = @$pair;
+\& move $from => $to ;
+\& }
+.Ve
+.PP
+Here is an example that renames all c files to cpp.
+.PP
+.Vb 1
+\& $ rename \*(Aq*.c\*(Aq \*(Aq#1.cpp\*(Aq
+.Ve
+.SS "A few example globmaps"
+.IX Subsection "A few example globmaps"
+Below are a few examples of globmaps
+.PP
+To copy all your .c file to a backup directory
+.PP
+.Vb 1
+\& \*(Aq</my/home/*.c>\*(Aq \*(Aq</my/backup/#1.c>\*(Aq
+.Ve
+.PP
+If you want to compress all
+.PP
+.Vb 1
+\& \*(Aq</my/home/*.[ch]>\*(Aq \*(Aq<*.gz>\*(Aq
+.Ve
+.PP
+To uncompress
+.PP
+.Vb 1
+\& \*(Aq</my/home/*.[ch].gz>\*(Aq \*(Aq</my/home/#1.#2>\*(Aq
+.Ve
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+File::Glob
+.SH AUTHOR
+.IX Header "AUTHOR"
+The \fIFile::GlobMapper\fR module was written by Paul Marquess, \fIpmqs@cpan.org\fR.
+.SH "COPYRIGHT AND LICENSE"
+.IX Header "COPYRIGHT AND LICENSE"
+Copyright (c) 2005 Paul Marquess. All rights reserved.
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.