I have a small query about this code. I had earlier asked you this
problem, but that time I had mentioned the directories in terms of
number s and so it was easier to use foreach loop. But now i need to
create directories which is a mixture of variables and number and then
I need to copy the file and give the respective folder name to the file.
Could anyone let me know if I could go for loop for this code
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.
#!\usr\bin\perl
use warnings;
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 $!;
print "Enter the file to copy: ";
$fl = <>;
chomp($fl);
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');
--- In perl-beginner@yahoogroups.com, "ramesh.govinda"
<ramesh.govinda@...> wrote:
>
> Hello All,
>
> I have a small query about this code. I had earlier asked you this
> problem, but that time I had mentioned the directories in terms of
> number s and so it was easier to use foreach loop. But now i need to
> create directories which is a mixture of variables and number and then
> I need to copy the file and give the respective folder name to the file.
>
> Could anyone let me know if I could go for loop for this code
>
> #!\usr\bin\perl
> use warnings;
> 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 $!;
> print "Enter the file to copy: ";
> $fl = <>;
> chomp($fl);
> use File::Copy;
> copy('F:/usr/eg/z/z.txt','F:/usr/eg/abc/FD');
> rename('F:/usr/eg/abc/FD/z.txt','F:/usr/eg/abc/FD/abc.txt');
> copy('F:/usr/eg/z/z.txt','F:/usr/eg/pqt/FD');
> rename('F:/usr/eg/pqt/FD/z.txt','F:/usr/eg/pqt/FD/pqt.txt');
> copy('F:/usr/eg/z/z.txt','F:/usr/eg/sde/FD');
> rename('F:/usr/eg/sde/FD/z.txt','F:/usr/eg/sde/FD/sde.txt');
>
> Regards,
> Ramesh
>
--- 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.
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$!;
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');
> >
>
--- 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!...!