--- In perl-beginner@yahoogroups.com, "ramesh.govinda"
<ramesh.govinda@...> wrote:
>
> Hi Chris,
>
> The code works out well. By using loop the code is very short now.
The
> only line which i could not understand is
>
> my ($rename) = $dir =~ m!/(\w+)/FD$!;
The left side of the assignment is a list (items within the
parentheses) of 1 item, $rename. This gives list context to the
regular expression matching statement on the right side of the
assignment operator. In this case, only 1 group is being captured -
the '\w+' in the parens in the regular expression.
Here, the regular expression is matching:
/ - a foward slash
(\w+) - 1 or more 'word' characters up to
/ - another forward slash
FD - the final two characters in your path
The dollar sign following 'FD' says that the 'FD' is at the end of
the string, (your path).
So, since the expression on the right side of the assignment
operator is in list context, it will return to the left a list of
all captured items, (only the \w, or word, characters in the only
captured group).
For the 3 paths you have supplied, $rename will be assigned abc, pqt
and sde.
The exclamation symbol '!' is used to begin and end the regular
expression, m!...!
To better understand regular expressions, you should read the docs.
http://perldoc.perl.org/perlretut.html
http://perldoc.perl.org/perlre.html
http://perldoc.perl.org/perlreref.html
I'm sure they will explain better than I can.
Chris
>
> Could you please explain me this syntax.
>
> Thanks in advance
>
> Regards,
> Ramesh
>
>
> --- In perl-beginner@yahoogroups.com, "a_z0_9_blah" <a_z0_9_blah@>
> wrote:
> >
> > --- In perl-beginner@yahoogroups.com, "ramesh.govinda"
> > <ramesh.govinda@> wrote:
> > >
> > > Following is another code using loop. But I have some problem
in
> > the
> > > loop as the file is copied to all my directories and it is
unable
> > to
> > > copy the z.txt to the subdirectories. eg: /abc/FD,
pqt/FD, /sde/FD.
> >
> >
> > Hello Ramesh
> >
> > Perhaps to following (untested) code will do what you want.
> >
> > Chris
> >
> >
> > > #!\usr\bin\perl
> >
> > #!/usr/bin/perl # those are 'forward' slashes.
> >
> >
> > > use warnings;
> >
> > use strict; #this pragma should be declared. It will catch and
> > report errors in your code.
> >
> > use File::Path;
> > use File::Copy;
> >
> >
> > > mkdir("F:/usr/eg/abc", 0777) || print $!;
> > > mkdir("F:/usr/eg/abc/FD", 0777) || print $!;
> > > mkdir("F:/usr/eg/pqt", 0777) || print $!;
> > > mkdir("F:/usr/eg/pqt/FD", 0777) || print $!;
> > > mkdir("F:/usr/eg/sde", 0777) || print $!;
> > > mkdir("F:/usr/eg/sde/FD", 0777) || print $!;
> >
> > my @dirs = qw[ F:/usr/eg/abc/FD F:/usr/eg/pqt/FD
F:/usr/eg/sde/FD];
> >
> > # no need to specify '0777'. (It is the default)
> > for my $dir (@dirs) {
> > mkpath($dir) or die $!;
> > }
> >
> >
> > > print "Enter the file to copy: ";
> > > $fl = <>;
> > > chomp($fl);
> >
> > chomp(my $file = <>);
> >
> > for my $dir (@dirs) {
> > my ($rename) = $dir =~ m!/(\w+)/FD$!;
> > copy($file, "$dir/$rename.txt") or die $!;
> > }
> >
> >
> >
> > > use File::Copy;
> > > opendir DIR, "."; # . is the current directory
> > >
> > > while ( $filename = readdir(DIR) )
> > > {
> > > if(-d $filename && $filename ne'.' && $filename ne '.')
> > > {
> > > print "copied $fl to: " , $filename,"\n";
> > > copy($fl,$filename);
> > > }
> > > }
> > > rename('F:/usr/eg/abc/FD/z.txt','F:/usr/eg/abc/FD/abc.txt');
> > > rename('F:/usr/eg/pqt/FD/z.txt','F:/usr/eg/pqt/FD/pqt.txt');
> > > rename('F:/usr/eg/sde/FD/z.txt','F:/usr/eg/sde/FD/sde.txt');
> > >
> >
>