in reply to Delete file from sub call within another sub

While it is good that you posted code, you need to make sure that posted code compiles and gives the output you state. When I attempt to execute your code, I get the following output on STDERR:

Bareword found where operator expected at fluff.pl line 10, near ") threeYrExpiration" (Missing operator before threeYrExpiration?) Global symbol "$current_mth" requires explicit package name at fluff.p +l line 8. Global symbol "$last_day_current_mth" requires explicit package name a +t fluff.pl line 8. syntax error at fluff.pl line 10, near ") threeYrExpiration" Global symbol "$unlinkCountTotal" requires explicit package name at fl +uff.pl line 21. Global symbol "@deleted_files" requires explicit package name at fluff +.pl line 23. Global symbol "$task" requires explicit package name at fluff.pl line +24. Global symbol "$logger" requires explicit package name at fluff.pl lin +e 25. Global symbol "$logger" requires explicit package name at fluff.pl lin +e 27. Global symbol "$task" requires explicit package name at fluff.pl line +28. Execution of fluff.pl aborted due to compilation errors.

where I have named my script fluff.pl. This tells me this is not the code that is giving you trouble, particularly as one of the errors is a missing block ({}). If I can't replicate your issue, then I can't identify it. There is nothing obviously wrong with your logic. Please post code that compiles that recreates your issue; see How do I post a question effectively?.

As a helpful side comment, if your actual code works when you copy/paste threeYrExpiration into file_handler, maybe you should leave it in there and modify file_handler to look more like:

sub file_handler { my ($abs_filename) = @_; return unless $current_mth == 1; return unless $last_day_current_mth == 31; threeYrExpiration($abs_filename); } # End of sub file_handler

Replies are listed 'Best First'.
Re^2: Delete file from sub call within another sub
by begood321 (Novice) on Nov 29, 2010 at 17:21 UTC

    Hi Kenneth,

    Thanks for your advice. However, I think you missed my point. If I change my code to:

    sub threeYrExpiration { my $abs_filename = $_[0]; my $unlinkStatus = unlink("$abs_filename"); if ($unlinkStatus == 1) { $unlinkCountTotal++; $abs_filename =~ s#.*WORKAREA\/[^\/]*##; push (@deleted_files, $abs_filename); $task->AddFile("$abs_filename", "Deleted by content expiration + report"); $logger->info("File to be deleted added to job: $abs_filename" +); } else { $logger->info("File to be deleted \"$abs_filename\" failed. Re +ceived $unlinkStatus instead of 1."); $task->CallBack(1, "Error Deleting expired file"); } }

    It works, which is good. However, I have another sub which does similar (using same variables) but has differences in processing. Hence the reason for wanting to use another method calling sub from within another sub as seen below. So basically using the 2 subs code would look similar to:

    sub file_handler { my ($abs_filename) = @_; if ((($current_mth == 1) && ($last_day_current_mth == 31)) { + threeYrExpiration($abs_filename); } else { sevenYrExpiration($abs_filename); } } # End of sub file_handler sub threeYrExpiration { my $abs_filename = $_[0]; my $unlinkStatus = unlink("$abs_filename"); if ($unlinkStatus == 1) { $unlinkCountTotal++; $abs_filename =~ s#.*WORKAREA\/[^\/]*##; push (@deleted_files, $abs_filename); $task->AddFile("$abs_filename", "Deleted by content expiration + report"); $logger->info("File to be deleted added to job: $abs_filename" +); } else { $logger->info("File to be deleted \"$abs_filename\" failed. Re +ceived $unlinkStatus instead of 1."); $task->CallBack(1, "Error Deleting expired file"); } } sub sevenYrExpiration { ... ... }
      I think you missed my point. Unless you can post a script that will compile and execute on my machine as is and replicates your issue, I cannot help you debug. Possible errors might be related to extensive use of closures/globals, that your original script does not actually use strict; (globals again) or that you've implemented prototyping incorrectly - personally, I suspect the first possibility. But without code, I can't really say any more. Perhaps this link would be helpful: Basic debugging checklist.
        Hi Kenneth,

        The code shown are just snippets of what I'm trying to do from actual code which is much larger. I am using strict, warnings and diagnostics which compiles error free, I just didn't include it this snippet. I had a typo in previous post. Actual code for subs should be with prototypes in sub definition below, $ was missing. However even with this corrected my code still fails. I have other code with same methodology within complete code using prototypes which works.

        In your 1st reply I have tried &threeYrExpiration in sub call but deletion was omitted during process which means the & in front of sub actually affects the input parameter $abs_filename.

        Change in logging level to warn and including $! shows actual error. However, this is strange because it says path is correct for actual file but saying doesn't exist as seen in error below:

        sub file_handler { my ($abs_filename) = @_; if ((($current_mth == 1) && ($last_day_current_mth == 31)) { threeYrExpiration($abs_filename); } else { sevenYrExpiration($abs_filename); } } # End of sub file_handler sub threeYrExpiration($) { my $abs_filename = $_[0]; my $unlinkStatus = unlink("$abs_filename"); if ($unlinkStatus == 1) { $unlinkCountTotal++; $abs_filename =~ s#.*WORKAREA\/[^\/]*##; push (@deleted_files, $abs_filename); $task->AddFile("$abs_filename", "Deleted by content expiration + report"); $logger->info("File to be deleted added to job: $abs_filename" +); } else { $logger->warn("Failed to delete '$abs_filename': <$!>" +); $task->CallBack(1, "Error Deleting expired file"); } } sub sevenYrExpiration($) { ... ... }

        Error:

        Mon Nov 29 11:50:42 2010 : INFO : expiration_report.ipl : File to be deleted added to job: /committees/comm_wkgrps/inactive/cold_snap_tf/20040514_FDWG-EGWI_ISSUE_LIST Rev7.xls:

        Mon Nov 29 11:50:42 2010 : WARN : expiration_report.ipl : Failed to delete '/iwmnt/default/main/internet/WORKAREA/home/committees/comm_wkgrps/inactive/cold_snap_tf/20040514_FDWG-EGWI_ISSUE_LIST Rev7.xls': <No such file or directory>