hector89 has asked for the wisdom of the Perl Monks concerning the following question:

i have written a code for iterating through a directory which is passed through command line to search a specific file format and then make some modification and save the updated file in same directory within same file.it's working fie if i'm rumming scipt for current directory but if i'm trying to give path for source directory on command line it's not working.

#!/usr/bin/perl use strict; my $dirName = $ARGV[0]; opendir(DIR, $dirName); my @files = grep(/\.txt$/,readdir(DIR)); closedir(DIR); # print all the filenames in our array my $txtfile; foreach $txtfile (@files) { print "$txtfile\n"; open my $input_fh, '<',$txtfile; my $delim = $/; $/ = ''; undef($/); my $file=<$input_fh>; close $input_fh; $file =~ s/(<%--)?\s*<script(.*?)>/($1 ? '' : "\n<%-- ") . "<script$2> +"/ige; $file =~ s=</script>\s*(-->)?='</script>' . ($1 ? '' : " -->\n")=ige; print $file; open my $output_fh, '>', $txtfile; print $output_fh $file; close $output_fh; }

suppose my directory path is c:\users\hector\desktop\collection and perl script path is c:\users\hector\desktop and writing perl command like this perl\path to perl script\path to dir

  • Comment on searching a particular file from a directory that is passed on command prompt
  • Download Code

Replies are listed 'Best First'.
Re: searching a particular file from a directory that is passed on command prompt
by Athanasius (Archbishop) on Jun 10, 2012 at 06:25 UTC

    Hi hector89,

    The problem is that readdir returns the names of files (or directories) in the specified directory, but not their paths. So you need to either:

    chdir $dirName;

    before entering the foreach loop, or else add:

    $txtfile = $dirName . '\\' . $txtfile;

    at the start of the code within the loop to prepend the directory path to each filename.

    You probably would have seen this yourself if you had included:

    use warnings;

    at the start of your script.

    Here is a working version with a little sanity checking added:

    #!/usr/bin/perl use strict; use warnings; (my $prog_name = $0) =~ s| ^ (?: .* [\\/])? (.*) \.pl $ |$1|x; (my $dirName = $ARGV[0]) or die "Usage: $prog_name <directory>"; opendir(DIR, $dirName) or die "Unable to open directory '$dirName': $!"; my @files = grep(/ \.txt $ /x, readdir(DIR)); closedir(DIR); chdir $dirName; # <-- EITHER add this foreach my $txtfile (@files) { # $txtfile = $dirName . '\\' . $txtfile; # <-- OR add this print "$txtfile\n"; open(my $input_fh, '<', $txtfile) or die "Unable to open file '$txtfile' for reading: $!"; undef($/); my $file = <$input_fh>; close $input_fh; $file =~ s/(<%--)?\s*<script(.*?)>/($1 ? '' : "\n<%-- ") . "<scrip +t$2>"/ige; $file =~ s=</script>\s*(-->)?='</script>' . ($1 ? '' : " -->\n")=i +ge; print $file; open(my $output_fh, '>', $txtfile) or die "Unable to open file '$txtfile' for writing: $!"; print $output_fh $file; close $output_fh; }

    HTH,

    Athanasius <°(((><contra mundum

Re: searching a particular file from a directory that is passed on command prompt
by hector89 (Novice) on Jun 10, 2012 at 15:15 UTC

    can anyone suggest me easiest way..i didnt get the regular expression for defining the path...anyone thanks for your help