Irfan N
Irfan N

Reputation: 93

Perl DosGlob fails after first evaluation

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.

Upvotes: 1

Views: 37

Answers (1)

Sobrique
Sobrique

Reputation: 53478

Because you set no_chdir so find doesn't chdir. Thus your various calls - with a relative path - fails. The simple solution would be using $File::Find::name instead of $_

I'd also note - you can just specify a directory list to File::Find - you don't need to do each separately.

Upvotes: 2

Related Questions