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

I have a script which poplulates filenames and last modified time of the respective file under a particular directory. I have used DosGlob module to specify the regex.

Sample directory structure is:

//share16/ABC/X/Output/1/

//share16/ABC/X/Output/2/

//share16/ABC/Y/Output/1/

//share16/ABC/Y/Output/2/

Below is the code which does the above and there is further code after this which is out of present context.

use File::DosGlob 'glob'; my @dir_regex = glob "//share16/ABC/*/Output/"; for my $dir (@dir_regex) { find({ wanted => \&process_file, no_chdir => 1 }, $dir) or die $!; } sub process_file { my $dummy = $_; if (-f $dummy) { my $filename = "//share16/TOOLS/report.txt"; open(my $fh, '>>', $filename) or die "Could not open file '$filename' +$!"; my $last_mod_time = ctime(stat($dummy)->mtime); print $fh "$last_mod_time $dummy\n"; } close $fh; }

The script successfully lists down the files under all folders (folder 1, folder 2) under the first directory X but fails immediately when it starts reading the folder Y.

Error: No such file or directory at \\share16\traverse4.pl line 5.

I am clueless as to why it is failing as I have tried hardcoding the foldername in @dir_regex but it still fails after listing the files under the first directory.

Replies are listed 'Best First'.
Re: Perl DosGlob fails after first evaluation of regex
by Monk::Thomas (Friar) on Aug 07, 2015 at 12:44 UTC

    Below is the code which does the above.

    No it doesn't.

    You stripped too much or something is seriously broken in the code, e.g. the variable $dir is used but never assigned. Apart from that: Your process_file() function has 2 problems - the first one is that you open/close the logfile file handle for every file that is being processed. The other one is

    sub process_file { ... if (-f $dummy) { ... open(my $fh, ... ... } close $fh; }

    'close()' is useless because by the time it is reached the variable $fh is no longer in scope. You're not a friend of strict and warnings, right?

Re: Perl DosGlob fails after first evaluation of regex
by Anonymous Monk on Aug 07, 2015 at 12:37 UTC

    I assume your find is from File::Find, in that case you shouldn't be checking its return value (find(...) or die $!;), since as far as I can tell it doesn't return a useful value - in a quick test it appears to just return the empty string, which is a "false" value in Perl. Hence, the first call to find works fine until it finishes, you test its return value, and then die. The error message you are outputting, $!, is simply staying set at whatever its last value was, and does not necessarily relate to the call of find.

    If you still think File::DosGlob is the problem, you should look at @dir_regex with Data::Dumper (see the Basic debugging checklist).