print "\nModifying the '.t' files...\n\n"; use File::Basename; use File::Copy; ## Change the below line to the folder you want to process $DirName = "/perl/scripts/t"; $FilesTotal = 0; $FilesRead = 0; $FilesModified = 0; opendir(DIR, $DirName); @Dirs = readdir(DIR); foreach $DirItem(@Dirs) { $DirItem = $DirName."/".$DirItem; push @DirNames, $DirItem; # All items under $DirName folder is copied into an array. } foreach $FileName(@DirNames) { if(-d $FileName) { # If an item is a folder, then open it further. opendir(SUBDIR, $FileName); @SubDirs = readdir(SUBDIR); close(SUBDIR); foreach $SubFileName(@SubDirs) { if(-f $SubFileName) { &Process_File($SubFileName); # If file, process it. } else { $SubFileName = $FileName."/".$SubFileName; push @DirNames, $SubFileName; # If sub-folder, push it into the array. } } } else { if(-f $FileName) { &Process_File($FileName); # If file, process it. } } } close(DIR); print "\n\n\nTotal number of files present = $FilesTotal\n"; print "Total number of '.t' files read = $FilesRead\n"; print "Total number of '.t' files modified = $FilesModified\n\n"; # Process the file. sub Process_File { local($FileToProcess) = @_; # File name. local($Modified) = 0; if(!(-w $FileToProcess)) { # If the file is a read-only file, then change its mode to read-write. chmod(0777, $FileToProcess); } ## For example: ## If the value of $FileToProcess is '/perl/scripts/t/pragma/warnings.t', then ## $dir = '/perl/scripts/t/pragma/' ## $base = 'warnings' ## $ext = '.t' $dir = dirname($FileToProcess); # Get the folder name $base = basename($FileToProcess); # Get the base name ($base, $dir, $ext) = fileparse($FileToProcess, '\..*'); # Get the extension of the file passed. # Do the processing only if the file has '.t' extension. if($ext eq '.t') { open(FH, "+< $FileToProcess") or die "Unable to open the file, $FileToProcess for reading and writing.\n"; @ARRAY = ; # Get the contents of the file into an array. foreach $Line(@ARRAY) # Get each line of the file. { if($Line =~ m/\@INC = /) { # If the line contains the string (@INC = ), then replace it # Replace "@INC = " with "unshift @INC, " $Line =~ s/\@INC = /unshift \@INC, /; $Modified = 1; } if($Line =~ m/push \@INC, /) { # If the line contains the string (push @INC, ), then replace it # Replace "push @INC, " with "unshift @INC, " $Line =~ s/push \@INC, /unshift \@INC, /; $Modified = 1; } } seek(FH, 0, 0); # Seek to the beginning. print FH @ARRAY; # Write the changed array into the file. close FH; # close the file. $FilesRead++; # One more file read. if($Modified) { print "Modified the file, $FileToProcess\n"; $Modified = 0; $FilesModified++; # One more file modified. } } $FilesTotal++; # One more file present. }